全手打原創,轉載請標明出處:https://www.cnblogs.com/dreamsqin/p/11305028.html
先重點說一下可能遇到的坑:主要在原本默認參數的設置以及兩個方法的選擇上,看完這篇總結你就知道怎么回事了~
throttle API走起
_.throttle(func, [wait=0], [options={}])
func (Function): 要節流的函數。
[wait=0] (number): 需要節流的毫秒數。
[options={}] (Object): 選項對象。
[options.leading=true] (boolean): 指定調用在節流開始前,默認true。
[options.trailing=true] (boolean): 指定調用在節流結束后,默認true。
throttle Demo走起(Vue寫法)
testThrottle: _.throttle(function() { console.log("throttle"); }, 5000, { leading: true, trailing: false })
testThrottle方法被綁定在一個按鈕上,demo最終的效果是 :
1、按鈕點擊后控制台立馬打印了throttle——19:39:00;
2、5秒內點擊多次按鈕,最終只打印一次throttle——19:39:05前;
3、5秒后再點擊一次,會重新打印throttle——19:39:05后;
PS:lodash默認trailing為true,那么最終的效果是在點擊時會立即打印throttle,且5秒后又會再打印一次,即節流之前和之后都會執行該節流函數。
throttle 總結走起
預先設定一個執行周期,當調用動作的時刻大於等於執行周期則執行該動作,然后進入下一個新的時間周期。
簡言之:結束時間點不會隨點擊改變
debounce API走起
_.debounce(func, [wait=0], [options={}])
func (Function): 要防抖動的函數。
[wait=0] (number): 需要延遲的毫秒數。
[options={}] (Object): 選項對象。
[options.leading=false] (boolean): 指定在延遲開始前調用,默認false。
[options.maxWait] (number): 設置 func 允許被延遲的最大值。
[options.trailing=true] (boolean): 指定在延遲結束后調用,默認true。
debounce Demo走起
testDebounce: _.debounce(function() { console.log("debounce"); }, 2000, { leading: true, trailing: false })
testDebounce方法被綁定在一個按鈕上,demo最終的效果是 :
1、按鈕點擊后控制台立馬打印了debounce——19:39:00;
2、5秒內點擊多次按鈕,最終只打印一次debounce——19:39:05前,假設19:39:04完成了最后一次點擊;
3、相對於最后一次點擊的5秒后再點擊一次,會重新打印debounce——19:39:09后;
PS:lodash默認leading為false、trailing為true,那么最終的效果是在點擊后等待5秒才會打印debounce,即延遲之前不執行函數,而是在延遲之后執行。
debounce 總結走起
當調用動作觸發一段時間后,才會執行該動作,若在這段時間間隔內又調用此動作則將重新計算時間間隔。
簡言之:結束時間點會隨點擊改變
綜上所述,適用情況如下:
throttle
(1)對於鍵盤事件,當用戶鍵入非常頻繁,但我們又必須要在一定時間(閥值)內執行處理函數的時候。例如:一些網頁游戲的鍵盤事件。
(2)對於鼠標移動和窗口滾動,鼠標的移動和窗口的滾動會帶來大量的事件,但是在一段時間內又必須看到頁面的效果。例如:對於可以拖動的div,如果使用debounce,那么div會在拖動停止后突然跳到目標位置;這時就需要使用throttle。
debounce
(1)對於鍵盤事件,當用戶輸入比較頻繁的時候,可以通過debounce合並鍵盤事件處理。例如:需要在用戶輸入完成時進行字符串校驗。
(2)對於ajax請求的情況。例如:當頁面下拉超過一定范圍就通過ajax請求新的頁面內容,這時候可以通過debounce合並ajax請求事件。