国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Vue 3 中的極致防抖/節(jié)流(含常見(jiàn)方式防抖/節(jié)流)

這篇具有很好參考價(jià)值的文章主要介紹了Vue 3 中的極致防抖/節(jié)流(含常見(jiàn)方式防抖/節(jié)流)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

vue3 防抖,JavaScript,Vue,vue.js,javascript,前端

各位朋友你們好呀。今天是立春,明天就是正月十五元宵節(jié)了,這種立春 + 元宵相隔的時(shí)候,可是很難遇到的,百年中就只有幾次。在這提前祝大家元宵快樂(lè)。

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

前言

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

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

防抖或節(jié)流原理

防抖(debounce)

如果用戶多次頻繁操作以最后一次為準(zhǔn),當(dāng)然也可以以第一次為準(zhǔn),進(jìn)行數(shù)據(jù)更新或者網(wǎng)絡(luò)資源請(qǐng)求,以消除冗余的操作,或者減少一定的請(qǐng)求資源浪費(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ā)多次只會(huì)執(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)境說(shuō)明

  • vue 3
  • vite

新封裝

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

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

防抖(debounce)

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

常見(jiàn)封裝-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)

常見(jiàn)封裝-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 來(lái)實(shí)現(xiàn)我們的新方式。這里我就不具體寫(xiě)了。我直接在每行代碼上面添加注釋。我相信朋友你是能看懂的。??????

代碼
// 從 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;
    // 對(duì) delay 進(jìn)行判斷,如果傳遞的是 null 則不需要使用 防抖方案,直接返回使用 ref 創(chuàng)建的。
    return delay == null 
        ? 
        // 返回 ref 創(chuàng)建的
        ref(data)
        : 
        // customRef 中會(huì)返回兩個(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)

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

常見(jiàn)封裝-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)

常見(jiàn)封裝-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é)流和防抖在封裝和使用上大同小異的。

代碼
// data 為創(chuàng)建時(shí)的數(shù)據(jù)
// delay 為節(jié)流時(shí)間
function throttleRef (data, delay = 300){
    // 創(chuàng)建定時(shí)器
    let timer = null;
    // 對(duì) delay 進(jìn)行判斷,如果傳遞的是 null 則不需要使用 節(jié)流方案,直接返回使用 ref 創(chuàng)建的。
    return delay == null 
        ? 
        // 返回 ref 創(chuàng)建的
        ref(data)
        : 
        // customRef 中會(huì)返回兩個(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) {
                    // 判斷
                    if(timer == null){
                        // 創(chuàng)建定時(shí)器
                        timer = setTimeout(() => {
                            // 修改數(shù)據(jù)
                            data = value;
                            // 派發(fā)更新
                            trigger()
                            // 清除定時(shí)器
                            clearTimeout(timer)
                            timer = null
                        }, 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)方式防抖/節(jié)流)這篇文章的全部?jī)?nèi)容,如有不足或朋友你有更好的方式或者其他獨(dú)到的見(jiàn)解,歡迎評(píng)論 + 私信。

當(dāng)然朋友你又學(xué)到了一招可以點(diǎn)贊 + 關(guān)注 + 評(píng)論哦。

希望本篇文章對(duì)正在閱讀的朋友你有所幫助。

想了解vue 2中如何實(shí)現(xiàn)相同方案的朋友可以點(diǎn)擊這里 ?? Vue 2 中的實(shí)現(xiàn) CustomRef 方式防抖/節(jié)流

我是桃小瑞,公眾號(hào) @ 桃小瑞。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-790570.html

到了這里,關(guān)于Vue 3 中的極致防抖/節(jié)流(含常見(jiàn)方式防抖/節(jié)流)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vue uniapp 防止按鈕多次點(diǎn)擊(類似于防抖節(jié)流)

    common文件并創(chuàng)建anti-shake.js文件 man.js文件中引入 頁(yè)面里使用即可 不傳參,直接傳一個(gè)方法就行 帶參數(shù),傳一個(gè)方法和一個(gè)參數(shù)就行?

    2024年02月11日
    瀏覽(26)
  • vue項(xiàng)目使用lodash節(jié)流防抖函數(shù)問(wèn)題與解決

    vue項(xiàng)目使用lodash節(jié)流防抖函數(shù)問(wèn)題與解決

    在lodash函數(shù)工具庫(kù)中,防抖 _.debounce 和節(jié)流 _.throttle 函數(shù)在一些頻繁觸發(fā)的事件中比較常用。 創(chuàng)建一個(gè) debounced(防抖動(dòng))函數(shù),該函數(shù)會(huì)從上一次被調(diào)用后,延遲? wait ?毫秒后調(diào)用? func ?方法。 參數(shù) func ? (Function) : 要防抖動(dòng)的函數(shù)。 [wait=0] ? (number) : 需要延遲的毫秒數(shù)。

    2024年02月08日
    瀏覽(23)
  • javascript常見(jiàn)100問(wèn)|前端基礎(chǔ)知識(shí)|問(wèn)ajax-fetch-axios-區(qū)別請(qǐng)用 XMLHttpRequestfetch 實(shí)現(xiàn) ajax節(jié)流和防抖px em rem vw/箭頭函數(shù)的缺點(diǎn)

    HTML CSS JS HTTP 等基礎(chǔ)知識(shí)是前端面試的第一步,基礎(chǔ)知識(shí)不過(guò)關(guān)將直接被拒。本章將通過(guò)多個(gè)面試題,講解前端??嫉幕A(chǔ)知識(shí)面試題,同時(shí)復(fù)習(xí)一些重要的知識(shí)點(diǎn)。 扎實(shí)的前端基礎(chǔ)知識(shí),是作為前端工程師的根本?;A(chǔ)知識(shí)能保證最基本的使用,即招聘進(jìn)來(lái)能干活,能產(chǎn)出

    2024年04月27日
    瀏覽(34)
  • 防抖和節(jié)流及多種實(shí)現(xiàn)方式

    當(dāng)用戶在網(wǎng)頁(yè)中進(jìn)行操作時(shí),如點(diǎn)擊、滾動(dòng)、輸入等,往往會(huì)頻繁地觸發(fā)事件。如果每個(gè)事件都立即執(zhí)行相應(yīng)的函數(shù),可能會(huì)導(dǎo)致性能問(wèn)題和用戶體驗(yàn)不佳,因?yàn)檫@些函數(shù)可能需要執(zhí)行復(fù)雜的操作,如計(jì)算、網(wǎng)絡(luò)請(qǐng)求等。 為了優(yōu)化這種情況,我們可以使用防抖和節(jié)流來(lái)限制函

    2023年04月24日
    瀏覽(19)
  • vue2.x通過(guò)指令實(shí)現(xiàn)v-debounce和v-throttle防抖節(jié)流的實(shí)現(xiàn),親測(cè)可用。

    vue2.x通過(guò)指令實(shí)現(xiàn)v-debounce和v-throttle防抖節(jié)流的實(shí)現(xiàn),親測(cè)可用。

    在vue2.x中,防抖和節(jié)流一般是通過(guò)引入防抖函數(shù) debounce 和節(jié)流函數(shù) throtte ,對(duì)事件回調(diào)進(jìn)行一層包裹,然后在模板中綁定包裹后的事件回調(diào),這樣每個(gè)需要用的地方都需要進(jìn)行防抖,節(jié)流函數(shù)的導(dǎo)入,事件回調(diào)的包裹,比較麻煩。通過(guò)摸索,有以下兩種方法。 通過(guò)重寫(xiě)Vue.

    2024年02月14日
    瀏覽(18)
  • vue3自定義指令之防抖

    我們使用 vue 時(shí),有時(shí)候需要用到自定義指令,例如一個(gè)防抖指令 現(xiàn)在有一個(gè)需求,用戶在點(diǎn)擊某個(gè)按鈕時(shí),我不希望用戶在瘋狂點(diǎn)擊后,每次點(diǎn)擊都會(huì)觸發(fā)事件,像服務(wù)器發(fā)送請(qǐng)求,這并不是我們預(yù)期的,所以我們需要在用戶點(diǎn)擊是做防抖處理。那么怎么做到方便復(fù)用的解

    2024年02月16日
    瀏覽(21)
  • vue3中的組件傳值的方式

    1. props 父組件使用 props 傳遞數(shù)據(jù)給子組件: 子組件使用 props 接收: 2. emit 自定義事件 子組件觸發(fā)事件,父組件監(jiān)聽(tīng)該事件并更新數(shù)據(jù): 3. refs 通過(guò) ref 給子組件綁定引用,然后通過(guò)該引用直接更新子組件的數(shù)據(jù)或調(diào)用子組件的方法: 在 child 組件中: 4. provide / inject 父組件提供數(shù)據(jù)

    2024年02月07日
    瀏覽(23)
  • 消滅前端閃爍魔鬼:Vue中的防抖術(shù)

    在前端的世界里,用戶操作如同一場(chǎng)狂風(fēng)驟雨,而我們的頁(yè)面則要頂住這些波瀾洶涌的輸入。有時(shí)候,我們希望頁(yè)面在用戶輸入停止后再作出響應(yīng),以避免頻繁觸發(fā)操作。這時(shí),Vue的防抖動(dòng)技術(shù)就如同時(shí)光隧道一樣,將我們帶回到寧?kù)o的過(guò)去。 本篇博客將帶你穿越時(shí)空,揭開(kāi)

    2024年02月02日
    瀏覽(17)
  • vue2使用lodash中的防抖(debounce)函數(shù)

    在Vue中使用防抖函數(shù)可以避免在頻繁觸發(fā)的事件中重復(fù)執(zhí)行操作,例如搜索框輸入時(shí)的實(shí)時(shí)搜索。下面是一個(gè)使用防抖函數(shù)的示例: 安裝防抖函數(shù)庫(kù) 首先,你需要安裝一個(gè)防抖函數(shù)庫(kù),例如lodash庫(kù)的 debounce 函數(shù)。你可以使用npm或yarn命令來(lái)安裝它: 或 在Vue組件中引入并使用

    2024年02月13日
    瀏覽(17)
  • 【vue3】vue3路由跳轉(zhuǎn)的方式

    如 : 有無(wú)this都行 $router.push(\\\'/plantduce\\\') this.$router.push(\\\'/plantduce\\\') vue3 || vue2 路由參考 useRouter 與 useRoute 都可以。

    2024年02月06日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包