一篇文章搞懂防抖和节流

01

前言

防抖和节流是前端解决频繁执行函数,以优化性能和用户体验。

防抖(Debounce)

连续触发某个事件时,当一定时间内没有再次触发事件时,才会执行事件的处理函数。 通俗来讲,就是有连续的事件触发时,前面的事件触发都被打断,不再执行,我只执行最后一次。可以想象一下王者回城被敌方英雄打断了,是不是又要进行重新回城,只有不被打断才能回城成功。

举个典型的案例:前端输入框,鼠标抬起事件,就会向后端发送一个请求,查询结果,但是想一下,如果鼠标每抬起一次,就往后端发送一个请求,频繁的请求后端,服务器的压力会非常大,所以,防抖就是为了防止频繁请求,我们可以通过定时器来记录,如果用户在一段时间内没有再执行某个事件,就代表可以执行处理函数,向后端发送请求了。

节流(Thrott le)

在一段时间内只执行一次处理函数,不管触发事件多少次。

节流的思想就是用定时器来记录,如果在一段时间内又再次调用处理函数,我们可以将这次执行失效,也就是说某个函数在一定时间间隔内只执行第一次的回调, 通俗来讲,就是在我第一次函数没执行完之前,不要打断我,无视后面的函数执行。可以想象一下王者中技能释放,技能放完了,是不是就没有办法再次放了,只有等CD结束后,才能再次释放。

举个典型的例子:

(1)有个button按钮是向后端进行发送请求获取结果数据的,现在用户一直频繁的点击按钮,那么能一直的请求后端服务吗?显然是不合适的,这样会造成后端服务压力的提升,而且页面也会频繁加载,影响体验。所以添加节流函数,防止那么无意义的请求。

(2)页面滚动事件,如果页面滚动1px就触发某个处理函数,页面会造成明显卡顿,不想滚动事件处理函数高频触发,而是希望每100毫秒最多执行一次,可以使用节流函数,减少计算提升性能。

区别

  • 节流:间隔时间执行,不管事件触发有多频繁,都会保证在规定时间内一定会执行一次。
  • 防抖:用户触发事件过于频繁,只会执行最后一次事件的操作。

02

节流实现

节流函数, 其中,func就是我们需要进行节流处理的函数,wait是事件执行的最小间隔时间,每隔wait才会执行一次func函数。

  
function throttle(func, wait) {  
 let timeId;  
 return function(...args) {  
 if (!timeId) {  
 timeId = setTimeout(() => {  
 func.apply(this, args);  
 timeId = null;  
 }, wait);  
 }  
 };  
}

防抖实现

防抖函数,其中func就是我们需要进行防抖处理的函数,wait是事件执行的最小间隔时间,当事件触发后wait时间内没有再次触发事件,才会执行func函数。

  
function debounce(func, wait) {  
 let timeId;  
 return function(...args) {  
 clearTimeout(timeId);  
 timeId = setTimeout(() => {  
 func.apply(this, args);  
 }, wait);  
 };  
}

第三方lodash库实现

上面都是手写实现的,那么也可以实现第三方库现成的方法,进行实现。比如lodash库,首先安装lodash库到项目依赖中

  
npm install --save lodash

(1)节流实现

  
import debounce from 'lodash/debounce'  
function func(){  
 //处理的逻辑代码  
}  
//直接调用debounce方法,传递逻辑函数和间隔时间  
const debounceFunc = debounce(this.func,1000);

(2)防抖实现

  
import throttle from 'lodash/throttle'  
function func(){  
 //处理的逻辑代码  
}  
//直接调用throttle方法,传递逻辑函数和间隔时间  
const throttleFunc = throttle(this.func,1000);

好了,今天分享的技术就到这里啦,点赞关注一下,更多技术干货持续更新中,感谢您的支持!

0
0
0
0
评论
未登录
暂无评论