vue中封装使用

* 函数防抖 (只执行最后一次点击)
*/
export const Debounce = (fn, t) => {
let delay = t || 500;
let timer;
return function () {
let args = arguments;
if(timer){
clearTimeout(timer);
}
timer = setTimeout(() => {
timer = null;
fn.apply(this, args);
}, delay);
}
};
/*
* 函数节流
*/
export const Throttle = (fn, t) => {
let last;
let timer;
let interval = t || 500;
return function () {
let args = arguments;
let now = +new Date();
if (last && now - last < interval) {
clearTimeout(timer);
timer = setTimeout(() => {
last = now;
fn.apply(this, args);
}, interval);
} else {
last = now;
fn.apply(this, args);
}
}
};
防抖
函数防抖:当持续触发事件时,一定时间段内没有在触发事件,事件处理函数才会执行一次,如在设定的时间结束之前,又触发了一次事件处理函数,就重新开始延迟。
<!--例子1-->
function debounce(fn,delay){
let timer = null;
return function (){
let context = this;
let args = arguments;
if(timer) clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this,args);
timer = null;
}, dalay);
}
}
节流
使得一定时间内只触发一次函数。原理是通过判断是否到达一定时间来触发函数。
//时间戳版
function throttle(func, wait) {
let previous = 0;
return function() {
let now = Date.now();
let context = this;
let args = arguments;
if (now - previous > wait) {
func.apply(context, args);
previous = now;
}
}
}
throttle(count,1000);
//定时器版
function throttle(func, wait) {
let timeout;
return function() {
let context = this;
let args = arguments;
if (!timeout) {
timeout = setTimeout(() => {
timeout = null;
func.apply(context, args)
}, wait)
}
}
}
区别
区别: 函数节流不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而函数防抖只是在最后一次事件后才触发一次函数。 比如在页面的无限加载场景下,我们需要用户在滚动页面时,每隔一段时间发一次 Ajax 请求,而不是在用户停下滚动页面操作时才去请求数据。这样的场景,就适合用节流技术来实现。