React 防抖(Debounce)Hook
防抖动 (debounce)是常见的需求,那么如何搭配 React Hooks 实现防抖动呢,下面演示两种方案。
方案一
副作用防抖
/**
*
* @param {React.EffectCallback} fn
* @param {React.DependencyList} deps
* @param {number} ms
*/
function useDebouncedEffect(fn, ms, deps) {
useEffect(() => {
let clean = null;
const timer = setTimeout(() => {
clean = fn();
}, ms);
return () => {
clearTimeout(timer);
if (clean) clean();
};
}, deps);
}
使用方式与 useEffect
一样,只是多了一个参数:
useDebouncedEffect(() => { ... }, 200, [val]);
方案二
回调防抖
/**
* @template {(...args: any[]) => void} T
* @param {T} fn
* @param {React.DependencyList} deps
* @param {number} ms
* @returns {T}
*/
function useDebouncedCallback(fn, ms, deps) {
const timerRef = useRef(null);
const funcRef = useRef(null);
useEffect(() => {
return () => {
clearTimeout(timerRef.current);
funcRef.current = null;
};
}, []);
return useMemo(() => {
funcRef.current = fn;
return function (...args) {
clearTimeout(timerRef.current);
timerRef.current = setTimeout(() => funcRef.current(...args), ms);
};
}, deps);
}
使用方式与 useCallback
一样,只是多了一个参数:
const func = useDebouncedCallback((...args) => { ... }, 200, [val]);
总结
上面的代码演示了两种使用用 React Hooks 实现防抖(debounce)的方法,也许存在边界情况未考虑,酌情使用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)