Vue3項目中使用防抖節(jié)流的實現(xiàn)示例
前言
防抖節(jié)流是可以說是一種優(yōu)化組件性能的技巧,可以有效減少組件中的渲染次數(shù)和計算量,從而提高組件的響應速度和用戶體驗。在Vue3中可以使用`lodash`庫中的`debounce`和`throttle`函數(shù)來分別實現(xiàn)防抖和節(jié)流。當然也可以自行設計實現(xiàn)防抖節(jié)流函數(shù),調用方式都差不多。
防抖:在一定時間內,多次觸發(fā)同一事件,只執(zhí)行最后一次操作,常用于輸入框搜索、滾動加載等場景。
節(jié)流:在一定時間內,多次觸發(fā)同一事件,限制函數(shù)執(zhí)行頻率,防止函數(shù)被頻繁調用,從而提高頁面性能。
一、基于Vue3內置的lodash函數(shù)庫實現(xiàn)防抖節(jié)流
(1)首先導入lodash函數(shù)庫的防抖和節(jié)流方法
import { debounce, throttle } from 'lodash'(2)隨便寫兩個按鈕
<el-button size="small" type="primary" @click="handleDebounceClick($event)"> <el-icon :size="16" style="margin-right: 5px;"><Basketball /></el-icon> <small>防抖·籃球</small> </el-button> <el-button size="small" type="primary" @click="handleThrottleClick($event)"> <el-icon :size="16" style="margin-right: 5px;"><Football /></el-icon> <small>節(jié)流·足球</small> </el-button>
(3)隨便寫兩個方法
/**
* 防抖·籃球
*/
const handleDebounceClick = debounce((evt) => {
// ---- ^ 業(yè)務邏輯 ----
// 定義fn方法
const fn = (evt) => {
console.log('debounce =>', evt)
}
// 調用fn方法
fn(evt)
// ---- / 業(yè)務邏輯 ----
}, 1000)
/**
* 節(jié)流·足球
*/
const handleThrottleClick = throttle((evt) => {
// ---- ^ 業(yè)務邏輯 ----
// 定義fn方法
const fn = (evt) => {
console.log('throttle =>', evt)
}
// 調用fn方法
fn(evt)
// ---- / 業(yè)務邏輯 ----
}, 1000)二、自行設計實現(xiàn)的防抖節(jié)流函數(shù)
(1)自行設計實現(xiàn)防抖節(jié)流的好處
關于Vue的防抖節(jié)流函數(shù)庫或插件已經(jīng)有很多了,這個可以自己搜一下并看看效果如何。那為何還需要自行設計實現(xiàn)防抖節(jié)流?因為有些需求需要定制化設計,同時你還知道了防抖節(jié)流的基本原理。
(2)防抖節(jié)流具體實現(xiàn)
/**
* 防抖
*/
const debounce = (fn, time) => {
let timer = null
return (...args) => {
const context = this
if (timer) {
clearTimeout(timer)
}
timer = setTimeout(() => {
fn.call(context, ...args)
}, time)
}
}
/**
* 節(jié)流
*/
const throttle = (fn, time) => {
let activeTime = null
return (...args) => {
const context = this
const current = Date.now()
if (current - activeTime >= time) {
fn.call(context, ...args)
activeTime = Date.now()
}
}
}(2)隨便寫兩個按鈕
<el-button size="small" type="primary" @click="handleDebounceClick($event, '你好')"> <el-icon :size="16" style="margin-right: 5px;"><Basketball /></el-icon> <small>防抖·籃球</small> </el-button> <el-button size="small" type="primary" @click="handleThrottleClick($event, '世界')"> <el-icon :size="16" style="margin-right: 5px;"><Football /></el-icon> <small>節(jié)流·足球</small> </el-button>
(3)隨便寫兩個方法
/**
* 防抖·籃球
*/
const handleDebounceClick = debounce((evt, str) => {
// ---- ^ 業(yè)務邏輯 ----
// 定義fn方法
const fn = (evt) => {
console.log('debounce =>', evt, str)
}
// 調用fn方法
fn(evt)
// ---- / 業(yè)務邏輯 ----
}, 1000)
/**
* 節(jié)流·足球
*/
const handleThrottleClick = throttle((evt, str) => {
// ---- ^ 業(yè)務邏輯 ----
// 定義fn方法
const fn = (evt) => {
console.log('throttle =>', evt, str)
}
// 調用fn方法
fn(evt)
// ---- / 業(yè)務邏輯 ----
}, 1000)三、運行效果

極致防抖和節(jié)流在以下場景中可以發(fā)揮作用:
1. 表單輸入:
當用戶在輸入框中連續(xù)輸入時,可以使用極致防抖來延遲觸發(fā)輸入事件的處理,避免頻繁的計算和請求。
2. 滾動加載:
當用戶滾動頁面時,可以使用節(jié)流來限制觸發(fā)滾動事件的頻率,以減少滾動事件的處理次數(shù),提高性能。
3. 頻繁點擊:
當用戶頻繁點擊某個按鈕或鏈接時,可以使用極致防抖來確保只有最后一次點擊被處理,避免重復操作。
4. 鼠標移動:
當用戶鼠標在頁面上移動時,可以使用節(jié)流來限制觸發(fā)鼠標移動事件的頻率,以減少事件的處理次數(shù)。
優(yōu)點:
提高性能:極致防抖和節(jié)流可以減少不必要的計算和請求,從而提高頁面的響應速度和性能。
- 減少資源消耗:限制函數(shù)的執(zhí)行頻率可以減少資源的消耗,如網(wǎng)絡帶寬、CPU計算等。
- 提升用戶體驗:通過減少不必要的操作和事件處理,可以提升用戶的體驗和滿意度。
缺點:
可能會延遲實際操作:由于極致防抖和節(jié)流會延遲函數(shù)的執(zhí)行,可能會導致用戶在某些情況下感覺到操作的延遲。
- 需要權衡延遲時間:選擇合適的延遲時間是一個挑戰(zhàn),如果延遲時間設置過長,可能會導致用戶體驗不佳;如果設置過短,可能會導致頻繁的函數(shù)執(zhí)行。
在實際應用中,需要根據(jù)具體的場景和需求來選擇使用極致防抖還是節(jié)流,以及適當調整延遲時間。同時,需要注意權衡延遲時間和用戶體驗之間的平衡,以及對性能的影響。
到此這篇關于Vue3項目中使用防抖節(jié)流的實現(xiàn)示例的文章就介紹到這了,更多相關Vue3 防抖節(jié)流內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決vue更新路由router-view復用組件內容不刷新的問題
今天小編就為大家分享一篇解決vue更新路由router-view復用組件內容不刷新的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
Nuxt引入vue-persistedstate以及踩坑記錄
這篇文章主要介紹了Nuxt引入vue-persistedstate以及踩坑記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10

