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): 設(shè)置func
允許被延遲的最大值。[options.trailing=true]
(boolean): 指定在延遲結(jié)束后調(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é)流結(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++; } }
結(jié)果很nice。
至于為什么,大概是lodash的 _.debounce
函數(shù)對this做了一些處理( _.throttle
函數(shù)本質(zhì)還是調(diào)用了 _.debounce
函數(shù)),有興趣的小伙伴兒可以看看_.debounce
的源碼。
到此這篇關(guān)于vue項目使用lodash節(jié)流防抖函數(shù)問題與解決的文章就介紹到這了,更多相關(guān)vue使用lodash節(jié)流防抖函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ElementUI?el-table?樹形數(shù)據(jù)的懶加載的實現(xiàn)
當面對大量數(shù)據(jù)時,一次性加載所有數(shù)據(jù)可能會導(dǎo)致性能問題,我們可以實現(xiàn)樹形數(shù)據(jù)的懶加載,本文主要介紹了ElementUI?el-table?樹形數(shù)據(jù)的懶加載,感興趣的可以了解一下2024-06-06Vue.js 中 ref 和 reactive 的區(qū)別及用法解析
在Vue.js中,ref主要用于創(chuàng)建響應(yīng)式的引用,通過.value屬性來訪問和修改值,特別適用于需要頻繁更改整個值的場景,而reactive則用于創(chuàng)建深度響應(yīng)的對象或數(shù)組,本文給大家介紹Vue.js 中 ref 和 reactive 的區(qū)別及用法,感興趣的朋友跟隨小編一起看看吧2024-09-09element-UI el-table修改input值視圖不更新問題
這篇文章主要介紹了element-UI el-table修改input值視圖不更新問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02