react版本:16.6.0
事情是这样的。一开始,是父组件来维护输入框数据的,useeffect会监听输入框的变化,然后做出操作。
但是我不想每次操作太频繁,于是在子组件这里让输入框维护自己的数据,不再去用父组件的数据。
在子组件里,当输入框数据变化时,我会每隔一段时间给父组件传递输入框的数据,进而触发父组件的操作。
但现在问题是,我发现我无法清空子组件的定时器,这个该如何操作?
const FilterHeader = ({ handleInput}) => {
// 防抖
const timerId = useRef()
const [val, setVal] = useState('')
const onChange = (e) => {
const value=e.target.value
setVal(value)
clearTimeout(timerId.current)
timerId.current = setTimeout(() => {
handleInput('name',value)
clearTimeout(timerId.current)
}, 600)
}
useEffect(()=>()=>{
console.log(timerId)
clearTimeout(timerId.current)
console.log(timerId) // 没有清掉
},[])
return <Input
type="text"
size="small"
name="name"
placeholder="输入关键词搜素"
onChange={onChange}
/>
}
很欣慰地看到你在
useEffect
返回的内层函数里面清除定时器,而不是直接清除。至少说明你对于清除副作用的地方是有所耳闻的,但是
useEffect
设计成这样,而不是专门搞一个useClearEffect
的钩子函数的原因是:所以再审视一下你自己的写法,问题就显而易见了。
要在 React 函数式组件中使用防抖/节流,最好是基于 react hooks 封装自己的防抖/节流 hook,参考: react-ahooks 源码分析之useDebounceFn和useDebounce 。