一文教你如何一個Vue指令搞定函數(shù)防抖
說在前面
防抖(Debounce)在前端開發(fā)中是一種常用的技術(shù),它的作用是限制某個操作在短時間內(nèi)的頻繁觸發(fā),只有在一定的間隔時間內(nèi)才執(zhí)行相應(yīng)的操作。
什么是防抖
函數(shù)防抖 方法是一個函數(shù),它的執(zhí)行被延遲了 t 毫秒,如果在這個時間窗口內(nèi)再次調(diào)用它,它的執(zhí)行將被取消。你編寫的防抖函數(shù)也應(yīng)該接收傳遞的參數(shù)。
例如,假設(shè) t = 50ms ,函數(shù)分別在 30ms 、 60ms 和 100ms 時調(diào)用。前兩個函數(shù)調(diào)用將被取消,第三個函數(shù)調(diào)用將在 150ms 執(zhí)行。如果改為 t = 35ms ,則第一個調(diào)用將被取消,第二個調(diào)用將在 95ms 執(zhí)行,第三個調(diào)用將在 135ms 執(zhí)行。
效果展示

實現(xiàn)原理
防抖函數(shù)實現(xiàn)步驟
- 1、當(dāng)需要執(zhí)行某個操作時,首先設(shè)置一個定時器。
- 2、如果在規(guī)定的時間間隔內(nèi)再次觸發(fā)了該操作,則清除之前的定時器。
- 3、重新設(shè)置一個新的定時器,以確保在最后一次觸發(fā)操作后的一段時間內(nèi)不再觸發(fā)操作。
- 4、最終在最后一次觸發(fā)操作后的時間間隔結(jié)束時執(zhí)行相應(yīng)的操作。
基本的防抖函數(shù)示例
function debounce(func, delay) {
let timer;
return function() {
const context = this;
const args = arguments;
clearTimeout(timer);
timer = setTimeout(() => {
func.apply(context, args);
}, delay);
};
}
// 創(chuàng)建一個防抖函數(shù)
const debouncedFunction = debounce(() => {
console.log('Debounced function is executed');
}, 300); // 設(shè)置延遲時間為300毫秒
// 在需要防抖的事件中調(diào)用防抖函數(shù)
window.addEventListener('scroll', debouncedFunction);
這種基礎(chǔ)的寫法應(yīng)該大部分同學(xué)都可以很輕松的寫出來,這里就不過多贅述了,主要看下怎么將其封裝成一個vue指令來使用。
封裝成vue指令
指令代碼
export default {
inserted: function (el, binding) {
const arg = binding.arg || 500;
let timer;
el.addEventListener("input", (e) => {
clearTimeout(timer);
timer = setTimeout(() => {
binding.value(e);
}, arg); // 設(shè)置延遲時間,單位為毫秒
});
},
};
這段代碼定義了一個自定義指令對象,其中的 inserted 方法會在指令綁定到元素上時被調(diào)用。在這里,我們將該指令綁定到輸入框上。
當(dāng)輸入框觸發(fā)輸入事件(input)時,會執(zhí)行回調(diào)函數(shù)。在回調(diào)函數(shù)中,通過 clearTimeout 清除之前的定時器,并重新設(shè)置一個新的定時器。這樣做的目的是確保在用戶連續(xù)輸入時只有最后一次輸入的內(nèi)容被處理。
在新的定時器中,會等待一段時間(由 arg 參數(shù)指定,單位為毫秒),然后執(zhí)行 binding.value(e),也就是調(diào)用傳入指令的值的函數(shù)并傳遞事件對象 e。這樣就實現(xiàn)了在輸入框輸入時應(yīng)用防抖函數(shù)的效果。
指令使用
<input
v-JDebounce:1000="handleInput"
class="input-content"
/>
methods: {
handleInput(event) {
const value = event.target.value;
if (value === "") {
this.inputContent = "";
return;
}
this.inputContent += `\n輸入了:${value}`;
},
}
v-JDebounce:1000:這是一個自定義指令的綁定,JDebounce 是指令的名稱,1000 是指令參數(shù),表示延遲時間為1000毫秒。handleInput:這是一個函數(shù)名,用于處理輸入框的輸入事件。
組件庫
組件文檔
目前該組件也已經(jīng)收錄到我的組件庫,組件文檔地址如下: jyeontu.xyz/jvuewheel/#/JDebounceView
組件內(nèi)容
組件庫中還有許多好玩有趣的組件,如:
- 懸浮按鈕
- 評論組件
- 詞云
- 瀑布流照片容器
- 視頻動態(tài)封面
- 3D輪播圖
- web桌寵
- 貢獻(xiàn)度面板
- 拖拽上傳
- 自動補全輸入框
- 圖片滑塊驗證
等等……
組件庫源碼
組件庫已開源到gitee,有興趣的也可以到這里看看:gitee.com/zheng_yongtao/jyeontu-component-warehouse
到此這篇關(guān)于一文教你如何一個Vue指令搞定函數(shù)防抖的文章就介紹到這了,更多相關(guān)Vue函數(shù)防抖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue axios調(diào)用接口方法報錯500 internal server err
前端使用axios 訪問后端接口時報錯,在瀏覽器中點擊紅色的報錯數(shù)據(jù),本文給大家分享vue axios調(diào)用接口方法報錯500 internal server error的兩種解決方法,感興趣的朋友一起看看吧2023-10-10
Vue3?實現(xiàn)驗證碼倒計時功能(刷新保持狀態(tài))
倒計時的運用場景是需要經(jīng)常用到的,但是根據(jù)業(yè)務(wù)的不同,好比手機驗證碼或者是郵箱驗證碼之類的,即使用戶跳轉(zhuǎn)到其它頁面或者刷新,再次回到登錄也,驗證碼的倒計時也得保持狀態(tài),下面通過本文給大家分享Vue3?驗證碼倒計時功能實現(xiàn),感興趣的朋友一起看看吧2022-08-08
Vue如何處理Axios多次請求數(shù)據(jù)顯示問題
這篇文章主要介紹了Vue如何處理Axios多次請求數(shù)據(jù)顯示問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
Vue中為什么要引入render函數(shù)的實現(xiàn)
本文主要介紹了Vue中為什么要引入render函數(shù)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01

