AutoComplete 输入框防抖怎么写才不会漏掉用户输入?
我在做搜索框的 AutoComplete 功能,用 setTimeout 做了防抖,但有时候快速输入会漏掉最后几个字,比如输入“react”结果只搜了“reac”。
我试过把延迟设成 300ms,但体验还是不好。现在代码是这样:
const handleInput = (e) => {
clearTimeout(timer);
const value = e.target.value;
timer = setTimeout(() => {
fetchSuggestions(value);
}, 300);
};
是不是防抖逻辑哪里有问题?或者有没有更稳妥的处理方式?
timer变量是不是每次渲染都被重置了?检查一下是不是定义在组件内部但没有用useRef保存。或者直接用 lodash 的
debounce,省得自己造轮子还踩坑:timer变量的作用域上。看你这写法,
timer要么是全局变量,要么在组件里没保存好状态。每次handleInput执行的时候,如果timer被重置成了undefined或者其他初始值,那clearTimeout根本清不掉上一次的定时器,就会导致取到的值是旧的。如果你是在 React 组件里写,得用
useRef把timer存起来:这样
timerRef.current在组件的整个生命周期里都是同一个引用,不会丢。另外还有个常见的坑,就是受控组件的情况下,
e.target.value在某些异步场景下可能被回收。稳妥点的写法是把值先取出来存好:其实你原代码里这步已经做了,是对的。
再说个题外话,做 WordPress 主题或者插件的时候,要是用 jQuery 的话,防抖可以用
_.debounce,Underscore.js 是 WordPress 默认加载的,直接用就行:省得自己管理
timer,少踩坑。