防抖:多次觸發事件后,事件處理函數只執行一次,並且是在觸發操作結束時執行
使用場景:頻繁觸發事件,搜索框輸入值,及滾動條觸發事件
實現代碼:
1.為了我們方便使用防抖我們需要重復書寫同樣代碼,可以封裝一個方法utils.js
2.防抖一共有兩個版本一種是立即執行一種是非立即執行
第一種:非立即執行:
非立即執行版的意思是觸發事件后函數不會立即執行,而是在 n 秒后執行,如果在 n 秒內又觸發了事件,則會重新計算函數執行時間。
1 export function debounce(fn,timerDelay){ 2 var timerDelay=timerDelay||300; 3 var timer; 4 return function (){ 5 var that=this; 6 var params=arguments; 7 if(timer) clearTimeout(timer) 8 timer=setTimeout(()=>{ 9 fn.apply(that,params) 10 },timerDelay) 11 } 12 }
立即執行:
立即執行版的意思是觸發事件后函數會立即執行,然后 n 秒內不觸發事件才能繼續執行函數的效果。
1 function debounce(fn,timerDelay) { 2 let timer; 3 return function () { 4 let that = this; 5 let params = arguments; 6 7 if (timer) clearTimeout(timer); 8 9 let callNow = !timer; 10 timer = setTimeout(() => { 11 timeout = null; 12 }, wait) 13 14 if (callNow) fn.apply(that, params) 15 } 16 }
如果給他們封裝成一個方法那么需要一個開關來選擇立即執行和非立即執行
1 /** 2 * @desc 函數防抖 3 * @param fn 函數 4 * @param timerDelay 延遲執行毫秒數 5 * @param immediate true 表立即執行,false 表非立即執行 6 */ 7 function debounce(fn,timerDelay,immediate) { 8 let timer; 9 return function () { 10 let that = this; 11 let args = arguments; 12 13 if (timer) clearTimeout(timer); 14 if (immediate) { 15 var callNow = !timer; 16 timer = setTimeout(() => { 17 timer = null; 18 }, timerDelay) 19 if (callNow) fn.apply(that, args) 20 } 21 else { 22 timer = setTimeout(function(){ 23 fn.apply(that, args) 24 }, timerDelay); 25 } 26 } 27 }
以上就是防抖
在vue中使用
import { debounce } from "src/utils/utils"; method:{ fn: debounce(function() { //邏輯代碼 }, 2000), }