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)的方法,也许存在边界情况未考虑,酌情使用。

posted @   1bite  阅读(325)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示