最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 前端防抖与节流

    正文概述 掘金(前端队长Daotin)   2021-06-20   436

    这是我参与更文挑战的第16天,活动详情查看: 更文挑战


    大家好,我是前端队长Daotin,想要获取更多前端精彩内容,关注我,解锁前端成长新姿势。

    以下正文:

    前端工作中免不了会用到防抖和节流,但是之前总容易搞混防抖和节流的定义,所以今天就来梳理一下防抖和节流的区别,以及如何使用的,什么时候应该用防抖,什么时候应该用节流。

    问题描述

    什么是前端防抖和节流?它们的区别是什么?怎么使用的?

    防抖

    概念:触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。

    思路:每次触发事件的时候,清除定时器,然后从新设置新的定时器。

    应用场景

    • 输入框search搜索联想,用户在不断输入值时触发input事件,用防抖来节约请求资源。
    • window触发resize的时候,不断的调整浏览器窗口大小会不断的触发这个事件,用防抖来让其只触发一次

    基本vue使用

    onDebounce() {
        // timer是该对象全局定义的,每次执行onDebounce函数,调用的相同的timer
        clearTimeout(this.timer); 
        this.timer = setTimeout(()=>{
            this.getAjax(); // 后台请求ajax信息
        }, 2000);
    },
    

    基本js代码

    function debounce(fn) {
      let timeout = null; // 创建一个闭包,保存一个标记用来存放定时器的返回值
      return function () {
        clearTimeout(timeout); // 每当用户输入的时候把前一个 setTimeout clear 掉
        timeout = setTimeout(() => { // 然后又创建一个新的 setTimeout, 这样就能保证输入字符后的 interval 间隔内如果还有字符输入的话,就不会执行 fn 函数
          fn.call(this);
        }, 500);
      };
    }
    
    document.getElementById('inp').addEventListener('input', debounce(getAjax)); // 防抖
    

    节流

    概念:高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率。

    简要思路:每此触发事件时判断是否定时器已满,满则重新定时,否则不做任何事。

    具体思路1:设置一个触发标志flag=true,在事件里面判断:如果flag==true,进行一次定时任务,并将flag=false,在定时任务里面执行获取ajax的代码,并将flag=true;如果flag=false,直接return出去不做任何事情,直到定时器满。

    具体思路2:不使用定时器,直接比较时间戳差值。

    应用场景

    • 鼠标不断点击触发,click/mousedown(单位时间内只触发一次)
    • 监听滚动事件,比如是否滑到底部自动加载更多,用throttle来判断

    思路1-vue代码

    onThrottle() {
        if(!this.throttleFlag) return;
            
        this.throttleFlag = false;
        this.timer = setTimeout(()=>{
            this.getAjax();
            this.throttleFlag = true;
        }, 2000);
    }
    

    思路1-js代码

    function throttle(fn) {
      let canRun = true; // 通过闭包保存一个标记
      return function () {
        if (!canRun) return; // 在函数开头判断标记是否为true,不为true则return
        canRun = false; // 立即设置为false
        setTimeout(() => { // 将外部传入的函数的执行放在setTimeout中
          fn.apply(this, arguments);
          // 最后在setTimeout执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了。当定时器没有执行的时候标记永远是false,在开头被return掉
          canRun = true;
        }, 500);
      };
    }
    
    window.addEventListener('resize', throttle(getAjax));
    

    思路2-vue代码

    onThrottle() {
        let now = Date.now();
        if (now - this.lastTime > 5000) { // 5s
            this.getAjax();
            this.lastTime = now; // update时间
        }
    }
    

    思路2-js代码

     function throttle (fn) {
        let lastTime = 0;  // 上次触发的时间
        return function () {
            let now = Date.now();
            if (now - lastTime > 5000) {
               fn.call(this);
               lastTime = now; // update时间
            }
        }
     }
    

    引用链接

    [1] 7分钟理解JS的节流、防抖及使用场景: juejin.im/post/5b8de8…
    [2] Daily-Interview-Question: github.com/Advanced-Fr…


    以上,如果你看了觉得对你有所帮助,就点个赞叭,这样Daotin也有更新下去的动力,跪谢各位父老乡亲啦~~~ 听说喜欢点赞的人,一个月内都会有好运降临哦 ~~


    起源地下载网 » 前端防抖与节流

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元