useSearchDebounce自定义React Hook工作机制及执行疑问解析
为什么useSearchDebounce连续输入只触发一次setTimeout?
这是因为这个Hook实现的是**防抖(Debounce)**逻辑,核心逻辑藏在useEffect的清理函数里:
当你连续输入"a"、"ab"、"abc"时,整个执行流程是这样的:
- 输入"a":
searchQuery变为"a",触发useEffect,创建一个5秒后执行的定时器。 - 在5秒内输入"ab":
searchQuery更新为"ab",此时useEffect的依赖项发生变化,会先执行上一次的清理函数——直接清除为"a"创建的那个还没到期的定时器,然后再新建一个针对"ab"的5秒定时器。 - 继续在5秒内输入"abc":重复上述逻辑,先清除"ab"对应的定时器,再新建"abc"的定时器。
只有当你停止输入后,超过5秒没有新的searchQuery变化,最后那个针对"abc"的定时器才会执行,所以你只会看到一次"setTimeout called"的日志。
防抖的核心作用就是:让高频触发的操作(比如输入框连续输入),在停止触发一段时间后,只执行最后一次操作,避免不必要的资源浪费(比如搜索场景,不用每输一个字符就发起请求)。
另外提个小细节:你提供的使用示例里有个小错误,Hook返回的是[search, setSearchQuery],所以输入框的onChange应该写成setSearchQuery(e.target.value),而不是setSearch。
内容的提问来源于stack exchange,提问作者Baxu
相关产品推荐
相关产品推荐

