最近看了些截流和防抖的文章,感觉有些写的有点扯了,其实很简单的事情,手撕一下最常用的截流和防抖:
/**
* 截流函数
* @param fn
* @param wait
*/
function throttle (fn: Function, wait: number = 800) {
let startTime = 0;
return function () {
let now = Date.now();
let resTime = now - startTime;
if (resTime >= wait) {
fn.apply(this, arguments);
startTime = now;
}
};
}
/**
* 防抖函数
* @param fn
* @param wait
*/
function debounce (fn: Function, wait: number = 800) {
let timer: any;
return function () {
let args = arguments;
clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, args);
}, wait);
};
}
为了在vue中使用方便,顺便来个装饰器:
/**
* throttle 装饰器
* @param wait
*/
function throttleDecorate (wait: number = 800) {
return (target, name, descriptor) => {
descriptor.value = throttle(descriptor.value, wait);
return descriptor;
};
}
大功告成,至于lodash的第三个参数,先触发式和后触发式,无非就是多层if判断而已,上面是我认为能在项目中比较实用的,不喜勿喷。