Vue2.x-使用防抖以及節(jié)流的示例
utils:
// 防抖
export const debounce = (func, wait = 3000, immediate = true) => {
let timeout = null;
return function() {
let context = this;
let args = arguments;
if (timeout) clearTimeout(timeout);
if (immediate) {
var callNow = !timeout; //點(diǎn)擊第一次為true 時(shí)間內(nèi)點(diǎn)擊第二次為false 時(shí)間結(jié)束則重復(fù)第一次
timeout = setTimeout(() => {
timeout = null;
}, wait); //定時(shí)器ID
if (callNow) func.apply(context, args);
} else {
timeout = setTimeout(function() {
func.apply(context, args);
}, wait);
}
};
};
// 時(shí)間戳方案
export const throttleTime = (fn, wait = 2000) => {
var pre = Date.now();
return function() {
var context = this;
var args = arguments;
var now = Date.now();
if (now - pre >= wait) {
fn.apply(context, args);
pre = Date.now();
}
};
};
// 定時(shí)器方案
export const throttleSetTimeout = (fn, wait = 3000) => {
var timer = null;
return function() {
var context = this;
var args = arguments;
if (!timer) {
timer = setTimeout(function() {
fn.apply(context, args);
timer = null;
}, wait);
}
};
};
vue中使用:
<template>
<div class="main">
<p>防抖立即執(zhí)行</p>
<button @click="click1">點(diǎn)擊</button>
<br />
<p>防抖不立即執(zhí)行</p>
<button @click="click2">點(diǎn)擊</button>
<br />
<p>節(jié)流時(shí)間戳方案</p>
<button @click="click3">點(diǎn)擊</button>
<br />
<p>節(jié)流定時(shí)器方案</p>
<button @click="click4">點(diǎn)擊</button>
</div>
</template>
<script>
import { debounce, throttleTime, throttleSetTimeout } from './utils';
export default {
methods: {
click1: debounce(
function() {
console.log('防抖立即執(zhí)行');
},
2000,
true
),
click2: debounce(
function() {
console.log('防抖不立即執(zhí)行');
},
2000,
false
),
click3: throttleTime(function() {
console.log('節(jié)流時(shí)間戳方案');
}),
click4: throttleSetTimeout(function() {
console.log('節(jié)流定時(shí)器方案');
})
},
};
</script>
<style scoped lang="scss">
* {
margin: 0;
font-size: 20px;
user-select: none;
}
.main {
position: absolute;
left: 50%;
transform: translateX(-50%);
width: 500px;
}
button {
margin-bottom: 100px;
}
</style>
解釋:
防抖:
立即執(zhí)行版本:immediate為true,則點(diǎn)擊第一次就執(zhí)行,再繼續(xù)點(diǎn)擊則不執(zhí)行,當(dāng)wait時(shí)間結(jié)束后,再點(diǎn)擊則生效,也就是只執(zhí)行第一次。
原理:
點(diǎn)擊第一次不存在timeoutID,并且callNow為true,則立即執(zhí)行目標(biāo)代碼,點(diǎn)擊第二次時(shí)存在了timeoutID,并且callNow為false,所以不執(zhí)行目標(biāo)代碼,當(dāng)wait時(shí)間結(jié)束后,把timeoutID設(shè)為null,則開始重復(fù)立即執(zhí)行邏輯。
不立即執(zhí)行版:immediate為false,則點(diǎn)擊第一次不執(zhí)行,當(dāng)wait時(shí)間結(jié)束后,才生效,也就是無論點(diǎn)擊多少次,只執(zhí)行最后一次點(diǎn)擊事件
原理:
使用setTimeout延遲執(zhí)行事件,如果多次觸發(fā),則clearTimeout上次執(zhí)行的代碼,重新開始計(jì)時(shí),在計(jì)時(shí)期間沒有觸發(fā)事件,則執(zhí)行目標(biāo)代碼。
節(jié)流:
連續(xù)觸發(fā)事件時(shí)以wait頻率執(zhí)行目標(biāo)代碼。
效果:

以上就是Vue2.x-使用防抖以及節(jié)流的示例的詳細(xì)內(nèi)容,更多關(guān)于vue 防抖及節(jié)流的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue腳手架配置代理服務(wù)器的兩種方式(小結(jié))
本文主要介紹了Vue腳手架配置代理服務(wù)器的兩種方式(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
淺談Vue使用Elementui修改默認(rèn)的最快方法
這篇文章主要介紹了淺談Vue使用Elementui修改默認(rèn)的最快方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
vue 通過 Prop 向子組件傳遞數(shù)據(jù)的實(shí)現(xiàn)方法
這篇文章主要介紹了vue 通過 Prop 向子組件傳遞數(shù)據(jù)的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Vue源碼解析之?dāng)?shù)據(jù)響應(yīng)系統(tǒng)的使用
這篇文章主要介紹了Vue源碼解析之?dāng)?shù)據(jù)響應(yīng)系統(tǒng)的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Vue3+Element?Plus使用svg加載iconfont的處理方法
這篇文章主要介紹了Vue3+Element?Plus使用svg加載iconfont的解決方案,本文詳細(xì)介紹了如何在Element?Plus中使用iconfont,簡單的說就是要將其封裝成SVG,并且支持動(dòng)態(tài)修改顏色,需要的朋友可以參考下2022-08-08
Vue中路由參數(shù)與查詢參數(shù)傳遞對(duì)比解析
在Vue.js中,路由與導(dǎo)航不僅涉及頁面切換,還包括了向頁面?zhèn)鬟f參數(shù)和獲取查詢參數(shù),這篇文章主要介紹了Vue路由參數(shù)與查詢參數(shù)傳遞,需要的朋友可以參考下2023-08-08
el-table樹形數(shù)據(jù)序號(hào)排序處理方案
這篇文章主要介紹了el-table樹形數(shù)據(jù)序號(hào)排序處理方案,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-03-03

