TONY 发表于 2026-5-11 04:56

防抖插件使用

问题表现
明明配置了防抖,但函数仍被频繁触发,或者最后一次操作后没有按预期执行,导致页面卡顿、请求重复发送,甚至在控制台看到“debounce is not a function”之类的报错。
可能原因
[*]防抖函数没有被正确绑定到事件上(比如在组件销毁时未取消,或者多次初始化了新的防抖实例)。
[*]延迟时间设置过短或过长,导致效果不明显或响应迟钝。
[*]在异步回调或循环中直接调用防抖函数,而不是保存后的引用。
[*]插件版本冲突,或与框架(React/Vue)的依赖项更新机制不兼容。
[*]忘记传入 leading / trailing 参数,导致**或最后一次执行不符合预期。

对应排查步骤
[*]检查事件绑定代码:确保 onInput 或 onClick 中传递的是 debouncedFn 而非直接调用 fn()。
[*]查看控制台 warnings:是否有“多次初始化”或“未注销”的提示。
[*]打印防抖函数的引用地址,确认每次事件触发时调用的是同一个函数对象。
[*]缩短延迟时间(如从 300ms 改为 500ms)测试效果,观察是否因时间太短导致视觉上“失效”。
[*]在组件卸载(如 Vue 的 beforeUnmount、React 的 useEffect 清理函数)中调用 cancel() 方法,避免残留定时器。

最终解决方案
[*]确保单例防抖:将防抖函数用 useRef(React)或 ref(Vue)保存,不随渲染重新生成。
[*]明确调用时机:使用 lodash.debounce 时,设置 { leading: false, trailing: true } 获得常规“最后一次执行”效果;如果需要**立即执行,改为 { leading: true, trailing: false }。
[*]绑定生命周期:在组件卸载时 cancel() 防抖实例,避免内存泄漏和旧任务执行。
[*]版本兼容:检查 lodash 或 underscore 版本是否过旧(<=4.17.20 存在已知 issue),升级到**并重启项目。
[*]调试辅助:临时在防抖函数**行加 console.log('debounced', Date.now()),观察触发频率和实际执行时刻是否与预期一致。

搞定以上几点,防抖插件就能安心为你工作啦!如果还不行,欢迎带着代码片段和框架版本继续追问~
页: [1]
查看完整版本: 防抖插件使用