关于防抖节流

前言

在开发过程中我们会遇到很多浏览器高频触发的事件,如按钮点击、输入框输入、页面滚动、鼠标移动等。这时候就需要用到防抖节流来优化性能,减少接口的请求次数,避免资源浪费。

防抖

防抖 (Debouncing) 功能是指触发高频事件后,n秒内函数只会执行一次。如果n秒内高频事件再次被触发,则重新计算时间。多次触发同一个事件,只执行最后一次操作。

function debounce(func, wait) {  
    let timeout;  
    return function() {  
        const context = this;  
        const args = arguments;  
        clearTimeout(timeout);  
        timeout = setTimeout(() => func.apply(context, args), wait);  
    };  
}  
  
// 使用示例  
const myEfficientFn = debounce(function() {  
    console.log('Debounced function called!');  
}, 250);  
  
window.addEventListener('resize', myEfficientFn);

节流

节流 (Throttling) 功能是指高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率。多次触发同一个事件,只执行第一次操作。

function throttle(func, limit) {  
    let inThrottle;  
    return function() {  
        const context = this;  
        const args = arguments;  
        if (!inThrottle) {  
            func.apply(context, args);  
            inThrottle = true;  
            setTimeout(() => inThrottle = false, limit);  
        }  
    };  
}  
  
// 使用示例  
const myEfficientFn = throttle(function() {  
    console.log('Throttled function called!');  
}, 250);  
  
window.addEventListener('scroll', myEfficientFn);

使用场景

节流的应用场景

  1. 搜索框实时搜索:在搜索框中输入关键词时,防抖可以避免频繁地触发搜索请求,只有在用户停止输入一段时间后才发送请求,减轻服务器压力。
  2. 窗口大小调整:当用户调整浏览器窗口大小时,窗口大小变化事件会连续触发,使用防抖可以确保只在用户完成调整后再进行布局计算,提高性能。
  3. 短信验证

节流的应用场景

  1. 页面滚动加载:在需要实现无限滚动加载的页面中,节流可以限制滚动事件的触发频率,控制数据的加载速度,提升用户体验。
  2. 按钮防重复点击:当用户点击按钮进行某个操作时,使用节流可以确保按钮点击事件在一定时间内只能触发一次,防止多次点击造成误操作。

尝试用loading替代节流

以点击查询按钮为例,我们的目的是在点击按钮之后等待接口返回之后再可以下一次点击事件的触发,也就是说其实我们有可能通过禁用按钮来达到这样的效果,在触发点击事件之后先将按钮禁用等待接口返回之后再解除按钮的禁用状态,从而达到物理防抖。

如果使用了类似element-ui这种组件库,组件库中的loading组件就可以很好的帮我们替代防抖节流,因为loading的底层也是使用了定时器来控制遮罩层的消失,遮罩层的交互也很直观的告诉用户不用多次点击,因此在有组件库的项目中,我个人认为使用loading比防抖方便不少,但是也有同学认为这个不如防抖保险,可能会出现连续两次点击的情况出现,但是我没有复现出来,可能是我的手速不够快哈哈哈哈,大家有什么不同的见解也可以多多在评论区交流。
这是element-ui中组件loading使用的方法的代码

### 概念解析 **防抖(Debounce)** 是一种技术,用于确保一个函数在某段时间内不再被调用后才执行。这种技术特别适用于那些频繁触发但只需要最后一次操作生效的情况,比如窗口调整大小、搜索框输入提示等。实现防抖的基本思路是使用 `setTimeout` 和 `clearTimeout` 来控制函数的执行时机。例如,当用户停止输入后的一段短时间内没有再次输入,才触发搜索请求[^3]。 ```javascript function debounce(func, wait) { let timeout; return function() { const context = this; const args = arguments; clearTimeout(timeout); timeout = setTimeout(() => { func.apply(context, args); }, wait); }; } ``` **节流(Throttle)** 则是另一种技术,它确保一个函数在指定的时间间隔内只执行一次。这对于那些需要定期更新状态但不需要每次触发都响应的场景非常有用,比如滚动条位置的更新、浏览器窗口大小的调整等。实现节流的一种常见方法是使用 `setTimeout` 或者时间戳来记录上一次执行的时间点,并据此决定是否应该执行函数[^2]。 ```javascript function throttle(func, wait) { let timeout; return function() { const context = this; const args = arguments; if (!timeout) { timeout = setTimeout(() => { timeout = null; func.apply(context, args); }, wait); } }; } ``` ### 区别 - **触发时机**:防抖是在最后一次触发后的某个时间段内没有再次触发才会执行;而节流则是确保在指定的时间间隔内只执行一次。 - **应用场景**:防抖适合处理那些需要在一系列连续操作结束后才执行一次的任务,如搜索框输入提示;而节流更适合那些需要定期执行的任务,如滚动条位置的更新[^1]。 ### 实现方式 除了上述的基本实现之外,还可以利用现有的库如 Lodash 提供的 `_.debounce` 和 `_.throttle` 方法来简化开发过程。这些库已经对这两种技术进行了高度优化,能够更好地处理各种边缘情况,同时提供了更多的配置选项来满足不同的需求。 ### 总结 合理选择和应用防抖节流不仅可以提高应用的性能,还能极大地改善用户体验。在实际开发过程中,应当根据具体的业务需求和技术特点来决定使用哪种技术以及如何配置相关参数。此外,虽然这两种技术都非常有用,但也需要注意避免过度使用,以免影响到应用的功能性和交互性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值