亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Vue3中的極致防抖/節(jié)流詳解(附常見方式防抖/節(jié)流)

 更新時(shí)間:2023年02月06日 11:15:29   作者:桃小瑞  
在JavaScript中函數(shù)的防抖和節(jié)流不是什么新鮮話題,這篇文章主要給大家介紹了關(guān)于Vue3中極致防抖/節(jié)流的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

今天給大家?guī)淼氖荲ue 3 中的極致防抖/節(jié)流(含常見方式防抖/節(jié)流)這篇文章,文章中不僅會講述原來使用的防抖或節(jié)流方式,還會帶來新的一種封裝方式,使用起來更簡單、更清晰。

在前端的開發(fā)過程中,在涉及到與用戶交互的過程中是基本上都是需要處理的,常規(guī)操作就是在對應(yīng)位置加上防抖或者節(jié)流。

加上防抖或者節(jié)流的作用:一是為了防止用戶頻繁操作;二是為了節(jié)約一定的服務(wù)器資源,減少資源浪費(fèi)的情況。

防抖或節(jié)流原理

防抖(debounce)

如果用戶多次頻繁操作以最后一次為準(zhǔn),當(dāng)然也可以以第一次為準(zhǔn),進(jìn)行數(shù)據(jù)更新或者網(wǎng)絡(luò)資源請求,以消除冗余的操作,或者減少一定的請求資源浪費(fèi)。

示例代碼

function debounce (fn, delay = 300){
    let timer = null
    return function (...args) {
        clearTimeout(timer)
        timer = setTimeout(()=>{
            fn.call(this, ...args)
        }, delay);
    }
}

使用

debounce(()=> count += 1, 1000)

節(jié)流(throttle )

在一定時(shí)間范圍內(nèi),用戶觸發(fā)多次只會執(zhí)行一次以達(dá)到防止用戶頻繁操作的目的。

示例代碼

let timer = null
function throttle (fn, delay = 300) {
    if(timer == null){
        timer = setTimeout(() => {
            fn()

            clearTimeout(timer)
            timer = null
        }, delay);
    }
}

使用

throttle(()=> count += 1, 1000)

環(huán)境說明

  • vue 3
  • vite

新封裝

這里我分兩個(gè)模塊來講述。一個(gè)是防抖;另一個(gè)是節(jié)流。

雖然這兩個(gè)差別不是很大,但還是有區(qū)別的。上車,兄弟們。??????

防抖(debounce)

先看常見封裝內(nèi)容。

常見封裝-1

代碼

function debounce (fn, delay = 300){
    let timer = null
    return function (...args) {
        if(timer != null){
            clearTimeout(timer)
            timer = null
        }
        timer = setTimeout(()=>{
            fn.call(this, ...args)
        }, delay);
    }
}

使用

const addCount = debounce(()=> count.value += 1, 1000)

常見封裝-2

代碼

let timer = null
function debounce (fn, delay = 1000){
    if(timer != null){
        clearTimeout(timer)
        timer = null
    }
    timer = setTimeout(fn, delay)
}

使用

const addCount = () => debounce(()=> count.value += 1, 1000)

新封裝

這里我們需要借助 vue 3 中的 customRef 來實(shí)現(xiàn)我們的新方式。這里我就不具體寫了。我直接在每行代碼上面添加注釋。我相信朋友你是能看懂的。??????

代碼

// 從 vue 中引入 customRef 和 ref
import { customRef, ref } from "vue"

// data 為創(chuàng)建時(shí)的數(shù)據(jù)
// delay 為防抖時(shí)間
function debounceRef (data, delay = 300){
    // 創(chuàng)建定時(shí)器
    let timer = null;
    // 對 delay 進(jìn)行判斷,如果傳遞的是 null 則不需要使用 防抖方案,直接返回使用 ref 創(chuàng)建的。
    return delay == null 
        ? 
        // 返回 ref 創(chuàng)建的
        ref(data)
        : 
        // customRef 中會返回兩個(gè)函數(shù)參數(shù)。一個(gè)是:track 在獲取數(shù)據(jù)時(shí)收集依賴的;一個(gè)是:trigger 在修改數(shù)據(jù)時(shí)進(jìn)行通知派發(fā)更新的。
        customRef((track, trigger) => {
            return {
                get () {
                    // 收集依賴
                    track()
                    // 返回當(dāng)前數(shù)據(jù)的值
                    return data
                },
                set (value) {
                    // 清除定時(shí)器
                    if(timer != null){
                        clearTimeout(timer)
                        timer = null
                    }
                    // 創(chuàng)建定時(shí)器
                    timer = setTimeout(() => {
                        // 修改數(shù)據(jù)
                        data = value;
                        // 派發(fā)更新
                        trigger()
                    }, delay)
                }
            }
        })
}

使用

// 創(chuàng)建
const count = debounceRef(0, 300)

// 函數(shù)中使用
const addCount = () => {
  count.value += 1
}

// v-model 中使用
<input type="text" v-model="count">

節(jié)流(throttle)

我們還是一樣,先看常見封裝內(nèi)容。

常見封裝-1

代碼

let timer = null
function throttle (fn, delay = 300) {
    if(timer == null){
        timer = setTimeout(() => {
            fn()

            clearTimeout(timer)
            timer = null
        }, delay);
    }
}

使用

const addCount = () => throttle(()=> count.value += 1, 1000)

常見封裝-2

代碼

function throttle (fn, delay = 300) {
    let timer = null
    return function (...args) {
        if(timer == null){
            timer = setTimeout(() => {
                fn.call(this, ...args)
    
                clearTimeout(timer)
                timer = null
            }, delay);
        }
    }
}

使用

const addCount = throttle(()=> count.value += 1, 1000)

新封裝

節(jié)流和防抖在封裝和使用上都是一模一樣的,但為了方便閱讀,我還是在下方為各位朋友 copy 了一份????。

代碼

// data 為創(chuàng)建時(shí)的數(shù)據(jù)
// delay 為節(jié)流時(shí)間
function throttleRef (data, delay = 300){
    // 創(chuàng)建定時(shí)器
    let timer = null;
    // 對 delay 進(jìn)行判斷,如果傳遞的是 null 則不需要使用 節(jié)流方案,直接返回使用 ref 創(chuàng)建的。
    return delay == null 
        ? 
        // 返回 ref 創(chuàng)建的
        ref(data)
        : 
        // customRef 中會返回兩個(gè)函數(shù)參數(shù)。一個(gè)是:track 在獲取數(shù)據(jù)時(shí)收集依賴的;一個(gè)是:trigger 在修改數(shù)據(jù)時(shí)進(jìn)行通知派發(fā)更新的。
        customRef((track, trigger) => {
            return {
                get () {
                    // 收集依賴
                    track()
                    // 返回當(dāng)前數(shù)據(jù)的值
                    return data
                },
                set (value) {
                    // 清除定時(shí)器
                    if(timer != null){
                        clearTimeout(timer)
                        timer = null
                    }
                    // 創(chuàng)建定時(shí)器
                    timer = setTimeout(() => {
                        // 修改數(shù)據(jù)
                        data = value;
                        // 派發(fā)更新
                        trigger()
                    }, delay)
                }
            }
        })
}

使用

// 創(chuàng)建
const count = debounceRef(0, 300)

// 函數(shù)中使用
const addCount = () => {
  count.value += 1
}

// v-model 中使用
<input type="text" v-model="count">

總結(jié)

以上便是Vue 3 中的極致防抖/節(jié)流(含常見方式防抖/節(jié)流)這篇文章的全部內(nèi)容

到此這篇關(guān)于Vue3中的極致防抖/節(jié)流詳解的文章就介紹到這了,更多相關(guān)Vue3極致防抖/節(jié)流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在vue中寫jsx的幾種方式

    在vue中寫jsx的幾種方式

    本文主要介紹了在vue中寫jsx的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • vue3封裝AES(CryptoJS)前端加密解密通信代碼實(shí)現(xiàn)

    vue3封裝AES(CryptoJS)前端加密解密通信代碼實(shí)現(xiàn)

    防止數(shù)據(jù)被爬取,前后端傳參接收參數(shù)需要加密處理,使用AES加密,這篇文章主要給大家介紹了關(guān)于vue3封裝AES(CryptoJS)前端加密解密通信代碼實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • Vue3+echarts繪制世界地圖的示例代碼

    Vue3+echarts繪制世界地圖的示例代碼

    最近做項(xiàng)目需要實(shí)現(xiàn)世界地圖,本文主要介紹了Vue3+echarts繪制世界地圖的示例代碼,具有一定的參考價(jià)值,感謝的可以了解一下
    2024-03-03
  • vue項(xiàng)目中如何使用video.js實(shí)現(xiàn)視頻播放與視頻進(jìn)度條打點(diǎn)

    vue項(xiàng)目中如何使用video.js實(shí)現(xiàn)視頻播放與視頻進(jìn)度條打點(diǎn)

    這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目中如何使用video.js實(shí)現(xiàn)視頻播放與視頻進(jìn)度條打點(diǎn)的相關(guān)資料,video.js是一款基于HTML5的網(wǎng)絡(luò)視頻播放器,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • vuex 中輔助函數(shù)mapGetters的基本用法詳解

    vuex 中輔助函數(shù)mapGetters的基本用法詳解

    mapGetters輔助函數(shù)僅僅是將 store 中的 getter 映射到局部計(jì)算屬性,在組件或界面中不使用mapGetter調(diào)用映射vuex中的getter,在組件或界面中使用mapGetter調(diào)用映射vuex中的getter,具體內(nèi)容跟隨小編一起通過本文學(xué)習(xí)吧 
    2021-07-07
  • 淺談VUE防抖與節(jié)流的最佳解決方案(函數(shù)式組件)

    淺談VUE防抖與節(jié)流的最佳解決方案(函數(shù)式組件)

    這篇文章主要介紹了淺談VUE防抖與節(jié)流的最佳解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Vue中比較流行且好用的組件使用示例

    Vue中比較流行且好用的組件使用示例

    這篇文章主要介紹了Vue中比較流行且好用的一些組件使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 詳解 vue.js用法和特性

    詳解 vue.js用法和特性

    Vue.js目前已經(jīng)更新到2.x,功能和語法上有一定升級和修改,本文首先介紹基礎(chǔ)內(nèi)容。感興趣的朋友一起看看吧
    2017-10-10
  • mpvue 如何使用騰訊視頻插件的方法

    mpvue 如何使用騰訊視頻插件的方法

    這篇文章主要介紹了mpvue 如何使用騰訊視頻插件的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • 解決element-ui中下拉菜單子選項(xiàng)click事件不觸發(fā)的問題

    解決element-ui中下拉菜單子選項(xiàng)click事件不觸發(fā)的問題

    今天小編就為大家分享一篇解決element-ui中下拉菜單子選項(xiàng)click事件不觸發(fā)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08

最新評論