vue項目使用lodash節(jié)流防抖函數(shù)問題解決方案
背景
在lodash函數(shù)工具庫中,防抖 _.debounce 和節(jié)流 _.throttle 函數(shù)在一些頻繁觸發(fā)的事件中比較常用。
防抖函數(shù) _.debounce(func, [wait=0], [options=])
創(chuàng)建一個 debounced(防抖動)函數(shù),該函數(shù)會從上一次被調(diào)用后,延遲 wait 毫秒后調(diào)用 func 方法。
參數(shù)
func(Function): 要防抖動的函數(shù)。[wait=0](number): 需要延遲的毫秒數(shù)。[options=](Object): 選項對象。[options.leading=false](boolean): 指定在延遲開始前調(diào)用。[options.maxWait](number): 設置func允許被延遲的最大值。[options.trailing=true](boolean): 指定在延遲結束后調(diào)用。
返回
- (Function): 返回 debounced(防抖動)函數(shù)。
節(jié)流函數(shù) _.throttle(func, [wait=0], [options=])
創(chuàng)建一個節(jié)流函數(shù),在 wait 毫秒內(nèi)最多執(zhí)行 func 一次的函數(shù)。
參數(shù)
func(Function): 要節(jié)流的函數(shù)。[wait=0](number): 需要節(jié)流的毫秒。[options=](Object): 選項對象。[options.leading=true](boolean): 指定調(diào)用在節(jié)流開始前。[options.trailing=true](boolean): 指定調(diào)用在節(jié)流結束后。
返回
(Function): 返回 throttled(節(jié)流)的函數(shù)。
在vue中使用防抖節(jié)流函數(shù)的問題
踩坑1
防抖節(jié)流函數(shù)實際上起到一個“稀釋”的作用,在vue項目中我們可能會這樣寫(節(jié)流為例)。
<template>
<div>
<button @click="add_throttle">加1</button>
<h1>{{ number }}</h1>
</div>
</template>
<script>
import { throttle } from 'lodash';
export default {
data() {
return {
number: 1
};
},
methods: {
// add函數(shù)做節(jié)流處理
add_throttle: throttle(this.add, 1000),
add() {
this.number++;
}
},
};
</script>然后我們信心滿滿地F12打開控制臺……

上面說 add 這玩意兒 undefined 了。
這其實是 this 的指向問題。實際上這里的 this 并不是vue實例(至于是什么,往下看你就知道了[doge]),所以自然不存在 add() 方法了。
踩坑2
既然直接使用 this.add() 不成,那我們換個思路,把 this.add() 放在函數(shù)里呢?
methods: {
// 做節(jié)流處理
add_throttle: throttle(() => {
this.add();
}, 1000),
add() {
this.number++;
}
}然后,自信滿滿地再次打開控制臺……
第一眼,誒,沒報錯,于是點擊按鈕……

梅開二度……
其實還是 this 的指向問題。我們知道箭頭函數(shù)是沒有 this 的,所以這里的 this 相當于踩坑1里的 this ,讓我們打印下,揭開它的廬山真面目。
methods: {
// 做節(jié)流處理
add_throttle: throttle(() => {
console.log(this);
}, 1000),
add() {
this.number++;
}
}
好家伙,原來這里的 this 本身就是 undefined 。
解決
既然是this的指向問題,那么只要保證 this 指向vue實例就行了,箭頭函數(shù)換成聲明式函數(shù)。
methods: {
// 做節(jié)流處理
add_throttle: throttle(function () {
this.add();
}, 1000),
add() {
this.number++;
}
}
結果很nice。
至于為什么,大概是lodash的 _.debounce 函數(shù)對this做了一些處理( _.throttle 函數(shù)本質(zhì)還是調(diào)用了 _.debounce 函數(shù)),有興趣的小伙伴兒可以看看_.debounce的源碼。
到此這篇關于vue項目使用lodash節(jié)流防抖函數(shù)問題與解決的文章就介紹到這了,更多相關vue使用lodash節(jié)流防抖函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue3模塊創(chuàng)建runtime-dom源碼解析
這篇文章主要為大家介紹了vue3模塊創(chuàng)建runtime-dom源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01
解決項目vite1.0升級到2.0打包遇到Some chunks are larger問題
本文主要介紹了解決項目vite1.0升級到2.0打包遇到Some chunks are larger問題,文中根據(jù)實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
vue?contextmenujs鼠標右鍵菜單高度不夠顯示不全的問題及解決方法
這篇文章主要介紹了使用vue-contextmenujs鼠標右鍵菜單時,當高度不夠時顯示不全的問題,大家需要注意本文給提供的解決方案雖然能夠解決現(xiàn)有問題,但是如果組件升級了,想要使用最新升級后的組件,還要再次修改代碼,需要的朋友可以參考下2022-07-07
解決VUE項目在IIS部署出現(xiàn):Uncaught SyntaxError: Unexpected&n
這篇文章介紹了解決VUE項目在IIS部署出現(xiàn):Uncaught SyntaxError: Unexpected token < 報錯的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-04-04
vuejs實現(xiàn)標簽選項卡動態(tài)更改css樣式的方法
這篇文章主要介紹了vuejs實現(xiàn)標簽選項卡-動態(tài)更改css樣式的方法,代碼分為html和js兩部分,需要的朋友可以參考下2018-05-05

