一文让你秒懂防抖与节流

一、函数防抖(debounce)

就是指触发事件后,在 n 秒内函数只执行最后一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间

废话不多说,上代码展示

<body>
      <input type="text" id='unDebounce'>
</body>
</html>

<script>
    //防抖函数
    function debounce(fn, delay) {
    var delay = delay || 200;
    var timer;
    return function () {
        var th = this;
        var args = arguments;
        if (timer) {
            clearTimeout(timer);
        }
        timer = setTimeout(function () {
            timer = null;
            fn.apply(th, args);
        }, delay);
    };
}

    //模拟一段ajax请求
    function ajax(content){ 
        console.log('ajax request ' + content) 
        };
    let inputa = document.getElementById('unDebounce');
    function fn(e){ ajax(e.target.value) }
    //防抖函数,处理多次被触发的事件,只执行最后一次
    inputa.addEventListener('input', debounce(fn,1000))
</script>

我们加入了防抖以后,当你在频繁的输入时,并不会发送请求,只有当你在指定间隔内没有输入时,才会执行函数。如果停止输入但是在指定间隔内又输入,会重新触发计时。

个人理解:函数防抖就是王者荣耀里英雄放技能的时候要有冷却,技能冷却没完再按技能就会重新计算冷却时间。

防抖使用场景

  • 搜索框搜索输入。只需用户最后一次输入完,再发送请求

  • 手机号、邮箱验证输入检测

  • 窗口大小Resize。只需窗口调整完成后,计算窗口大小。防止重复渲染

 二、函数节流(throttle)

就是指连续触发事件,但是在 n 秒中只执行一次函数

废话不多说,上代码展示

<body>
      <input type="text" id='unDebounce'>
</body>
</html>

<script>
//节流函数
function  throttle(fn, interval) {
    var last;
    var timer;
    var interval = interval || 200;
    return function () {
        var th = this;
        var args = arguments;
        var now = +new Date();
        if (last && now - last < interval) {
            clearTimeout(timer);
            timer = setTimeout(function () {
                last = now;
                fn.apply(th, args);
            }, interval);
        } else {
            last = now;
            fn.apply(th, args);
        }
    }
}
    //模拟一段ajax请求
    function ajax(content){ 
        console.log('ajax request ' + content) 
        };
    let inputa = document.getElementById('unDebounce');
    function fn(e){ ajax(e.target.value) }
    //防抖节流,无论你输入多块,每隔1秒钟执行一次
    inputa.addEventListener('input', throttle(fn,1000))
</script>

不管我们设定的执行时间间隔多小,总是1s内只执行一次。

个人理解: 函数节流就是fps游戏(如穿越火线)的射速,就算一直按着鼠标射击,也只会在规定射击时间内射出一定子弹。

节流使用场景:

  • 滚动加载,加载更多或滚到底部监听

  • 谷歌搜索框,搜索联想功能

  • 高频点击提交,表单重复提交

 三、总结

函数防抖和函数节流都是防止某一时间频繁触发,但是这两兄弟之间的原理却不一样。
函数防抖是某一段时间内只执行一次,而函数节流是间隔时间执行。

                                  博主博客会持续更新,敬请期待!

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在React应用开发中,可以通过使用React Hook机制来更方便地实现防抖节流功能。防抖函数(Debounce)可以用于在用户输入时延迟执行某个操作,以避免频繁触发操作。通过设置一个定时器,在指定的时间内没有再次触发操作时,才执行相应的逻辑。节流函数可以用于限制某个操作的执行频率,无论用户多快地触发操作,操作的逻辑都会按照设置的间隔时间执行。在React中使用节流函数可以通过设置定时器,在指定的时间间隔内只执行一次操作。 对于非受控组件,上述方式比较适用。如果需要在受控组件中实现防抖节流功能,可以采用React Hooks机制。通过useState Hook来定义一个state变量来存储输入框的值,然后通过useEffect Hook来监听该state变量的变化。当输入框的值发生变化时,可以通过设置一个定时器来延迟执行异步请求操作。在这种情况下,可以将防抖节流功能结合起来使用,以达到更好的用户体验。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [一文如何在 React 中使用 防抖(Debounce)和 节流Throttle)](https://blog.csdn.net/weixin_53312997/article/details/129248753)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值