Vue3通過hooks方式封裝節(jié)流和防抖的代碼詳解
創(chuàng)建 useThrottle Hook
節(jié)流函數(shù)的作用是確保一個函數(shù)在一段時間內(nèi)只能被執(zhí)行一次,即使它被連續(xù)調(diào)用多次也只會執(zhí)行一次。
import { ref, onBeforeUnmount } from 'vue';
function useThrottle(callback, delay = 100) {
let timerId = ref(null);
const cancel = () => {
if (timerId.value !== null) {
clearTimeout(timerId.value);
timerId.value = null;
}
};
const throttledCallback = (...args) => {
if (!timerId.value) {
timerId.value = setTimeout(() => {
callback(...args);
timerId.value = null;
}, delay);
}
};
onBeforeUnmount(cancel); // 在組件卸載前清除定時器
return [throttledCallback, cancel];
}
export default useThrottle;
創(chuàng)建 useDebounce Hook
防抖函數(shù)則是確保在一個給定的時間段內(nèi),只有最后一次操作會觸發(fā)函數(shù)執(zhí)行,如果在這段時間內(nèi)還有新的操作發(fā)生,則重新計時。
import { ref, onBeforeUnmount } from 'vue';
function useDebounce(callback, delay = 100) {
let timerId = ref(null);
const cancel = () => {
if (timerId.value !== null) {
clearTimeout(timerId.value);
timerId.value = null;
}
};
const debouncedCallback = (...args) => {
cancel(); // 取消之前的定時器
timerId.value = setTimeout(() => {
callback(...args);
}, delay);
};
onBeforeUnmount(cancel); // 在組件卸載前清除定時器
return [debouncedCallback, cancel];
}
export default useDebounce;
解析
- useThrottle: 這個 hook 接受一個回調(diào)函數(shù)
callback和一個延遲時間delay。它返回一個被節(jié)流的函數(shù)throttledCallback,這個函數(shù)在首次調(diào)用后會設(shè)置一個定時器,在delay時間之后執(zhí)行callback并重置定時器。此外,它還返回了一個cancel函數(shù)用來取消定時器。 - useDebounce: 類似于
useThrottle,但是它在每次調(diào)用debouncedCallback時都會先取消任何未完成的定時器,然后再設(shè)置一個新的定時器。這意味著只有在最后一次調(diào)用后的delay時間結(jié)束后,callback才會被執(zhí)行。
在 Vue 組件中使用這些 hooks
<template>
<div>
<button @click="handleClick">Click me</button>
<p>Clicked at: {{ lastClickTime }}</p>
</div>
</template>
<script>
import useThrottle from './useThrottle';
import useDebounce from './useDebounce';
export default {
setup() {
const lastClickTime = ref('');
const handleAction = () => {
lastClickTime.value = new Date().toISOString();
};
// 使用節(jié)流
const [handleClickThrottled] = useThrottle(handleAction, 500);
// 或者使用防抖
// const [handleClickDebounced] = useDebounce(handleAction, 500);
return {
lastClickTime,
handleClick: handleClickThrottled,
// 或者使用防抖版本
// handleClick: handleClickDebounced,
};
},
};
</script>
這樣,每次點擊按鈕時,節(jié)流或防抖處理函數(shù)就會被調(diào)用,并更新 lastClickTime。你可以根據(jù)需要選擇使用節(jié)流或防抖處理函數(shù)。
以上就是Vue3通過hooks方式封裝節(jié)流和防抖的代碼詳解的詳細內(nèi)容,更多關(guān)于Vue3 hooks封裝節(jié)流和防抖的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue項目中的遇錯:Invalid?Host?header問題
這篇文章主要介紹了vue項目中的遇錯:Invalid?Host?header問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
vue如何實現(xiàn)多組關(guān)鍵詞對應(yīng)高亮顯示
這篇文章主要介紹了vue如何實現(xiàn)多組關(guān)鍵詞對應(yīng)高亮顯示問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10
vue-cli或vue項目利用HBuilder打包成移動端app操作
這篇文章主要介紹了vue-cli或vue項目利用HBuilder打包成移動端app操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
Vue通過Blob對象實現(xiàn)導(dǎo)出Excel功能示例代碼
這篇文章主要介紹了Vue通過Blob對象實現(xiàn)導(dǎo)出Excel功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
淺談vuejs實現(xiàn)數(shù)據(jù)驅(qū)動視圖原理
這篇文章主要介紹了淺談vuejs實現(xiàn)數(shù)據(jù)驅(qū)動視圖原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02

