淺析Vue 防抖與節(jié)流的使用
在一個電影項目中,我想在電影的列表中,保存下拉的當(dāng)前位置,防止你切換頁面后,再切換回當(dāng)前的電影列表頁,他就又回到電影的第一條數(shù)據(jù)。
這時候,我不想每次只要滑動一點,就保存當(dāng)前位置,我想隔一段時間,保存一次,這時候,就可以使用防抖和節(jié)流。
概念
說白了, 防抖節(jié)流就是使用定時器 來實現(xiàn)我們的目的。
防抖(debounce):
在事件被觸發(fā)n秒后再執(zhí)行回調(diào),如果在這n秒內(nèi)又被觸發(fā),則重新計時。
典型的案例就是輸入框搜索:輸入結(jié)束后n秒才進(jìn)行搜索請求,n秒內(nèi)又輸入的內(nèi)容,則重新計時。
節(jié)流(throttle):
規(guī)定在一個單位時間內(nèi),只能觸發(fā)一次函數(shù),如果這個單位時間內(nèi)觸發(fā)多次函數(shù),只有一次生效。
典型的案例就是鼠標(biāo)不斷點擊觸發(fā),規(guī)定在n秒內(nèi)多次點擊只生效一次。
用法
防抖(debounce)
下拉列表,隔一段時間保存當(dāng)前下拉位置。
我們可以在 mounted 鉤子中實現(xiàn)我們的防抖:
// 防抖 定時器
let timer;
//list就是電影列表 ref="list" $el獲取DOM元素
this.$refs.list.$el.addEventListener("scroll", e => {
console.log("---->",e.target.scrollTop) //不使用防抖
if (timer) {
//清空timer
clearTimeout(timer);
}
timer = setTimeout(() => {
console.log(e.target.scrollTop) //使用防抖
//在sessionStorage中保存當(dāng)前下拉位置
// sessionStorage.setItem("position", e.target.scrollTop);
}, 75); //75mm為最佳
});
效果演示(隔一段時間保存當(dāng)前位置):
加 ----> 為不使用防抖,沒加的則使用防抖
輸入框搜索隔段時間進(jìn)行搜索請求:
<template>
<div>
<input type="text" @keyup="debounce" />
</div>
</template>
<script>
//定義 timer
let timer;
export default {
methods: {
debounce: function() {
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(() => {
console.log("防抖...");
timer = undefined;
}, 2000);
}
}
};
</script>
節(jié)流(throttle)
在n秒內(nèi)點擊多次,只有一次生效。
<template>
<div>
<button @click="throttle">按鈕</button>
</div>
</template>
<script>
//定義
let timer, lastTime;
export default {
methods: {
throttle: function() {
let now = +new Date();
if (lastTime && lastTime - now < 200) { //在200ms內(nèi)點擊多次,只有一次生效
clearTimeout(timer);
}
timer = setTimeout(() => {
console.log("點擊...");
lastTime = +new Date();
}, 200);
}
}
};
</script>
效果演示:
補(bǔ)充
當(dāng)然,也可以對這兩個方法進(jìn)行封裝,以便在多處使用。
/**
* 函數(shù)防抖 (只執(zhí)行最后一次點擊)
*/
export const Debounce = (fn, t) => {
let delay = t || 500;
let timer;
console.log(fn)
console.log(typeof fn)
return function () {
let args = arguments;
if(timer){
clearTimeout(timer);
}
timer = setTimeout(() => {
timer = null;
fn.apply(this, args);
}, delay);
}
};
/*
* 函數(shù)節(jié)流
*/
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);
}
}
};
總結(jié)
以上所述是小編給大家介紹的Vue 防抖與節(jié)流的使用,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
vue項目中swiper輪播active圖片實現(xiàn)居中并放大
這篇文章主要介紹了vue項目中swiper輪播active圖片實現(xiàn)居中并放大方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
安裝@vue/cli 報錯npm WARN deprecated request
這篇文章主要介紹了安裝@vue/cli 報錯npm WARN deprecated request@2.88.2問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
vue中設(shè)置height:100%無效的問題及解決方法
這篇文章主要介紹了vue中設(shè)置height 100%無效的問題及解決方法,需要的朋友可以參考下2018-07-07
vxe-list?vue?如何實現(xiàn)下拉框的虛擬列表
這篇文章主要介紹了vxe-list?vue?如何實現(xiàn)下拉框的虛擬列表,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
Vue父子組件方法this.$emit()有時候不觸發(fā)問題及解決
這篇文章主要介紹了Vue父子組件方法this.$emit()有時候不觸發(fā)問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
Vue3?封裝擴(kuò)展并簡化Vuex在組件中的調(diào)用問題
這篇文章主要介紹了Vue3?封裝擴(kuò)展并簡化Vuex在組件中的調(diào)用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-01-01

