防抖与节流概述 使用lodash实现防抖与节流 在Vue中使用防抖和节流
函数防抖 _.debounce:防止重复触发,延迟函数执行。即不管debounce函数触发了多久,只在最后一次触发debounce函数时,才定义setTimeout,到达间隔时间再执行 需要防抖的函数。 用处:多用于 input 框 输入时,显示匹配的输入内容的情况
函数节流_.throttle: 真正的含义是:单位时间n秒内,第一次触发函数并执行,以后 n秒内不管触发多少次,都不执行。直到下一个单位时间n秒,第一次触发函数并执行,这个n秒内不管函数多少次都不执行。 用处:多用于页面scroll滚动,或者窗口resize,或者防止按钮重复点击等情况
函数防抖是 n秒后延迟执行;而函数节流是立马执行,n秒后再立马执行。
防抖和节流的区别 1.共同点:降频, 2.不同点 :思路不同
防抖:某个时间内不能再次触发,一旦触发,就要重新计算
节流:限制相邻两次调用的时间间隔
注意点 :防抖和节流不止上面两种方案可以执行
短时间内不重复触发一个事件 设置一个门槛值,表示两次 Ajax 通信的最小间隔时间。如果在间隔时间内,发生新的keydown事件,则不触发 Ajax 通信,并且重新开始计时。如果过了指定时间,没有发生新的keydown事件,再将数据发送出去。
这种做法叫做 debounce(防抖动)。假定两次 Ajax 通信的间隔不得小于2500毫秒,上面的代码可以改写成下面这样。
$('textarea').on('keydown', debounce(ajaxAction, 2500));
function debounce(fn, delay){
var timer = null; // 声明计时器
return function() {
var context = this;
var args = arguments;
clearTimeout(timer);
timer = setTimeout(function () {
fn.apply(context, args);
}, delay);
};
}
上面代码中,只要在2500毫秒之内,用户再次击键,就会取消上一次的定时器,然后再新建一个定时器。这样就保证了回调函数之间的调用间隔,至少是2500毫秒。
用法示例:
参考资料 js教程 Vue中防抖(debounce)、节流(throttle)的介绍与运用
Debouncing and Throttling Explained Through Examples lodash.debounce lodash.throttle
第三方库 :Lodash
添加依赖:
yarn add lodash.throttle
yarn add lodash.debounce
使用:
import _ from 'lodash'
export default {
data() {
return {
a: 0
}
},
methods: {
func1: _.throttle(function(data) {
...
this.a = 1
}, 2000),
func2: _.debounce(function(data) {
...
}, 2000),
}
}
tip 注意
在throttle与debounce中需要使用非箭头的匿名函数形式,由于lodash已对this做了绑定处理,函数体中的this就是当前Vue组件实例。
参考: