• React-Hooks怎样封装防抖和节流-面试真题


    Debounce

    debounce 原意消除抖动,对于事件触发频繁的场景,只有最后由程序控制的事件是有效的。

    防抖函数,我们需要做的是在一件事触发的时候设置一个定时器使事件延迟发生,在定时器期间事件再次触发的话则清除重置定时器,直到定时器到时仍不被清除,事件才真正发生。

    const debounce = (fun, delay) => {
       
      let timer;
      return (...params) => {
       
        if (timer) {
       
          clearTimeout(timer);
        }
        timer = setTimeout(() => {
       
          fun(...params);
        }, delay);
      };
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    如果事件发生使一个变量频繁变化,那么使用debounce可以降低修改次数。通过传入修改函数,获得一个新的修改函数来使用。

    如果是class组件,新函数可以挂载到组件this上,但是函数式组件局部变量每次render都会创建,debounce失去作用,这时需要通过useRef来保存成员函数(下文throttle通过useRef保存函数),是不够便捷的,就有了将debounce做成一个hook的必要。

    function useDebounceHook(value, delay) {
       
      const [debounceValue, setDebounceValue] = useState(value);
      useEffect(() => {
       
        let timer = setTimeout(() => setDebounceValue(value), delay);
        return () => clearTimeout(timer);
      }, [value, delay]);
      return debounceValue;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在函数式组件中,可以将目标变量通过useDebounceHook转化一次,只有在满足delay的延迟之后,才会触发,在delay期间的触发都会重置计时。

    配合useEffect,在debounce value改变之后才会做出一些动作。下面的text这个state频繁变化,但是依赖的是debounceText,所以引发的useEffect回调函数却是在指定延迟之后才会触发。

    const [text,setText]=useState('');
    const debounceText = useDebounceHook(text, 2000);
    useEffect(() => {
       
      
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    【面试题】Vue2为什么能通过this访问到data、methods的属性或方法
    提升“架构思维”?这本书值得一读!
    好的代码是优质资产、莫让代码成为负债
    python知识点
    第九章 javaScript基础
    Linux常见指令3
    Docker 安装 Nginx 容器 (完整详细版)
    Spring Boot集成JPA和ClickHouse数据库
    S5PV210裸机(七):Nand和iNand
    (3) OpenCV图像处理kNN近邻算法
  • 原文地址:https://blog.csdn.net/beifeng11996/article/details/127915480