美文网首页
防抖与节流

防抖与节流

作者: 依然还是或者其他 | 来源:发表于2020-06-08 10:51 被阅读0次

    防抖

    防抖是点击后的n秒后执行,如果在n秒内再次触发,则重新进行计算(即可以理解为最后一次)

    export const debounce = (fn = () => {}, delay = 200) => {
      let timer;
      return (...args) => {
        const event = args[args.length - 1];
          
        clearTimeout(timer);
        //处理React合成事件
        if (event && typeof event.persist === "function") {
          event.persist();
        }
        timer = setTimeout(() => {
          fn.apply(this, args);
          clearTimeout(timer);
        }, delay);
      };
    };
    

    节流

    节流是单位时间内只会触发一次

    export const throttle = (fn, delay = 200) => {
      let timer= null;
      return (...args) => {
        if (!timer) {
          return;
        }
        //处理React合成事件
        const event = args[args.length - 1];
        if (event && typeof event.persist === "function") {
          event.persist();
        }
        timer = setTimeout(() => {
          fn.apply(this, args);
          clearTimeout(timer);
          timer=null;
        }, delay);
      };
    };
    

    场景

    防抖:
    搜索框搜索输入
    节流:
    搜索框的联想功能

    在React中关于 防抖、节流需要注意的一点——关于合成事件

    因为React中事件为合成事件,且React出于性能考虑,在事件回调被调用后,事件会被重用且所有属性将无效,(即异步调用会出现问题)
    所以当在fn中调用合成事件,React会抛出一个红色warning。

    解决方法:
    event.persist()
    这将从事件池中删除合成事件,并保留用户对事件的引用
    具体文档可以看这里

    相关文章

      网友评论

          本文标题:防抖与节流

          本文链接:https://www.haomeiwen.com/subject/ffxhphtx.html