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

Vue面試必備之防抖和節(jié)流的使用

 更新時(shí)間:2023年03月24日 14:37:04   作者:前端技術(shù)棧  
在這篇文章中,大家會(huì)了解到如何在 Vue 組件中使用防抖和節(jié)流控制 觀察者(watchers)以及事件處理程序,文中的示例代碼簡(jiǎn)潔易懂,希望對(duì)大家有所幫助

在監(jiān)聽(tīng)頻繁觸發(fā)的事件時(shí),一定要多加小心,比如 用戶(hù)在輸入框打字、窗口大小調(diào)整、滾動(dòng)、Intersection Observer 事件。

這些事件總是被頻繁觸發(fā),可能 幾秒一次。如果針對(duì)每次事件都發(fā)起 fetch 請(qǐng)求(或類(lèi)似的行為),那顯然是不明智的。

我們需要做的就是減緩事件處理程序的執(zhí)行速度。這種緩沖技術(shù)就是 防抖(debounce) 和 節(jié)流(throttle) 。

在本文中,你會(huì)了解到如何在 Vue 組件中 使用 防抖 和 節(jié)流 控制 觀察者(watchers) 和 事件處理程序。

1. 觀察者 防抖

我們先從一個(gè)簡(jiǎn)單的組件開(kāi)始,我們的任務(wù)是 將用戶(hù)輸入到 文本框中的文本 輸出到控制臺(tái):

<template>
<inputv-model="value"type="text" />
<p>{{ value }}</p>
</template>

<script>exportdefault {
  data() {
    return {
      value: "",
    };
  },
  watch: {
    value(newValue, oldValue) {
      console.log("Value changed: ", newValue);
    }
  }
};
</script>

在 輸入框 敲幾個(gè)字符。每次輸入時(shí),值就會(huì)被 log 到控制臺(tái)。

我們通過(guò)使用 觀察者(watcher) 監(jiān)聽(tīng) value 數(shù)據(jù)屬性 來(lái)實(shí)現(xiàn)了打印日志。但如果你想在 觀察者的回調(diào) 中加入一個(gè) 使用 value 作為參數(shù) 的 GET 請(qǐng)求,那你應(yīng)該不會(huì)期望太過(guò)頻繁地發(fā)起請(qǐng)求。

我們來(lái)對(duì) 打印控制臺(tái)日志 這個(gè)行為做一下 防抖。核心思想是創(chuàng)建一個(gè) 防抖函數(shù),然后在 觀察者 內(nèi)部調(diào)用該函數(shù)。

我在這里選擇了 'lodash.debounce' 的 防抖實(shí)現(xiàn),但你可以自由選擇喜歡的實(shí)現(xiàn)方式。

我們來(lái)將 防抖邏輯 應(yīng)用到組件:

<template>
<inputv-model="value"type="text" />
<p>{{ value }}</p>
</template>

<script>

import debounce from"lodash.debounce";
exportdefault {
  data() {
    return {
      value: "",
    };
  },
  watch: {
    value(...args) {
      this.debouncedWatch(...args);
    },
  },
  created() {
    this.debouncedWatch = debounce((newValue, oldValue) => {
      console.log('New value:', newValue);
    }, 500);
  },
  beforeUnmount() {
    this.debouncedWatch.cancel();
  },
};
</script>

但有一個(gè)區(qū)別:只有在最后一次輸入的 500ms 之后,才會(huì)將新的輸入值打印日志到控制臺(tái)。這說(shuō)明 防抖 在生效。

觀察者 的 防抖實(shí)現(xiàn) 只需要 3 個(gè)簡(jiǎn)單步驟:

在 create() 鉤子 里,創(chuàng)建 防抖回調(diào),并將其賦值到實(shí)例上:this.debouncedWatch = debounce(..., 500)。

在 觀察者 回調(diào) watch.value() { ... } 中 傳入正確的參數(shù) 調(diào)用 this.debouncedWatch()。

最后,beforeUnmount() 鉤子中 調(diào)用 this.debouncedWatch.cancel() ,在卸載組件之前,取消所有還在 pending 的 防抖函數(shù)執(zhí)行。

采用同樣的方式,你可以對(duì)任意數(shù)據(jù)屬性的 觀察者 應(yīng)用 防抖。然后就可以安全執(zhí)行 防抖回調(diào)內(nèi)部的一些比較重的操作,比如 網(wǎng)絡(luò)請(qǐng)求、繁重的 DOM 操作,等等。

2. 事件處理器 防抖

上面一節(jié),我展示了如何對(duì) 觀察者 使用 防抖,那么常規(guī)的事件處理器呢?

我們重用之前用戶(hù)輸入數(shù)據(jù)到輸入框的例子,但這一次會(huì)給輸入框加個(gè) 事件處理器。

像往常一樣,如果你沒(méi)有采取任何緩沖的措施,每當(dāng)值被修改時(shí),會(huì)被打印到控制臺(tái):

<template>
<inputv-on:input="handler"type="text" />
</template>

<script>
exportdefault {
  methods: {
    handler(event) {
      console.log('New value:', event.target.value);
    }
  }
};
</script>

在輸入框打幾個(gè)字符??纯纯刂婆_(tái):你會(huì)發(fā)現(xiàn)每次你輸入的時(shí)候就會(huì)有日志被打印出來(lái)。

同樣,如果你會(huì)執(zhí)行一些比較重的操作(比如網(wǎng)絡(luò)請(qǐng)求),可就不合適了。

對(duì) 事件處理器 使用 防抖,可以參考下面這個(gè):

<template>
<inputv-on:input="debouncedHandler"type="text" />
</template>

<script>

import debounce from"lodash.debounce";
exportdefault {
  created() {
    this.debouncedHandler = debounce(event => {
      console.log('New value:', event.target.value);
    }, 500);
  },
  beforeUnmount() {
    this.debouncedHandler.cancel();
  }
};
</script>

輸入一些字符。組件只有在最后一次輸入的 500ms 之后,才會(huì)將新的輸入值打印日志到控制臺(tái)。防抖 再一次生效了!

事件處理器 的 防抖實(shí)現(xiàn) 只需要 3 個(gè)步驟:

1.在 create() 鉤子 里,創(chuàng)建實(shí)例后,立刻將 防抖回調(diào) debounce(event => {...}, 500) 賦值到 this.debouncedHandler 。

2.在輸入框的 template 中 給 v-on:input 賦上 debouncedHandler :<input v-on:input="debouncedHandler" type="text" />

3.最后,在卸載組件之前, 在 beforeUnmount() 鉤子中 調(diào)用 this.debouncedHandler.cancel() ,取消所有還在 pending 的 函數(shù)調(diào)用。

另一方面,這些例子應(yīng)用了 防抖 的技術(shù)。然而,同樣的方式可以以用于創(chuàng)建 節(jié)流函數(shù)。

3. 注意

你可能不理解:為什么不直接在 組件的 method 選項(xiàng)中創(chuàng)建 防抖函數(shù),然后在 template 中調(diào)用這些方法作為事件處理器?

// ...
  methods: {
    // Why not?
    debouncedHandler: debounce(function () { ... }}, 500)
  }
// ...

這比在實(shí)例對(duì)象上創(chuàng)建 防抖函數(shù) 要簡(jiǎn)單的多。

例如:

<template>
<inputv-on:input="debouncedHandler"type="text" />
</template>

<script>

import debounce from"lodash.debounce";
exportdefault {
  methods: {
    // Don't do this!debouncedHandler: debounce(function(event) {
      console.log('New value:', event.target.value);
    }, 500)
  }
};

</script>

這次不是在 created() 鉤子 里創(chuàng)建 防抖回調(diào)了,而是將 防抖回調(diào) 賦給了 methods.debouncedHandler 。

你如果試過(guò) demo,你會(huì)發(fā)現(xiàn)是有效果的!

問(wèn)題是,組件使用 export default { ... } 導(dǎo)出的 options 對(duì)象,包括方法,會(huì)被組件實(shí)例重用。

如果網(wǎng)頁(yè)中有 2 個(gè)以上的組件實(shí)例,那么所有的組件都會(huì)應(yīng)用 相同 的防抖函數(shù) methods.debouncedHandler — 這會(huì)導(dǎo)致防抖出現(xiàn)故障。

4. 總結(jié)

在 Vue 中,可以很輕松的對(duì) 觀察者 和 事件處理器 應(yīng)用 防抖 和 節(jié)流。

核心邏輯就是,在 created() 鉤子 里,創(chuàng)建 防抖 或 節(jié)流 的回調(diào),并賦值在實(shí)例上。

// ...created() {
    this.debouncedCallback = debounce((...args) => {
      // The debounced callback
    }, 500);
  },
// ...

A)然后在觀察者內(nèi)部調(diào)用實(shí)例上的防抖函數(shù):

// ...watch: {
    value(...args) {
      this.debouncedCallback(...args);
    },
  },
// ...

B)或在 template 中設(shè)定一個(gè)事件處理器:

<template><inputv-on:input="debouncedHandler"type="text" /></template>

在這之后,每次調(diào)用 this.debouncedCallback(...args) ,就算執(zhí)行頻率非常高,內(nèi)部的回調(diào)也能緩沖執(zhí)行。

到此這篇關(guān)于Vue面試必備之防抖和節(jié)流的使用的文章就介紹到這了,更多相關(guān)Vue防抖 節(jié)流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue中的this.$options.data()和this.$data用法說(shuō)明

    Vue中的this.$options.data()和this.$data用法說(shuō)明

    這篇文章主要介紹了Vue中的this.$options.data()和this.$data用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • 淺析Vue.js 中的條件渲染指令

    淺析Vue.js 中的條件渲染指令

    這篇文章主要介紹了Vue.js 中的條件渲染指令,Vue.js 中的條件渲染指令可以根據(jù)表達(dá)式的值,來(lái)決定在 DOM 中是渲染還是銷(xiāo)毀元素或組件。本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • vue3源碼分析reactivity實(shí)現(xiàn)原理

    vue3源碼分析reactivity實(shí)現(xiàn)原理

    這篇文章主要為大家介紹了vue3源碼分析reactivity實(shí)現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • vue+moment實(shí)現(xiàn)倒計(jì)時(shí)效果

    vue+moment實(shí)現(xiàn)倒計(jì)時(shí)效果

    這篇文章主要為大家詳細(xì)介紹了vue+moment實(shí)現(xiàn)倒計(jì)時(shí)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • uni app仿微信頂部導(dǎo)航條功能

    uni app仿微信頂部導(dǎo)航條功能

    這篇文章主要介紹了uni-app自定義導(dǎo)航欄按鈕|uniapp仿微信頂部導(dǎo)航條功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • vue權(quán)限管理系統(tǒng)的實(shí)現(xiàn)代碼

    vue權(quán)限管理系統(tǒng)的實(shí)現(xiàn)代碼

    這篇文章主要介紹了vue權(quán)限管理系統(tǒng)的實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • 解決antd日期選擇組件,添加value就無(wú)法點(diǎn)擊下一年和下一月問(wèn)題

    解決antd日期選擇組件,添加value就無(wú)法點(diǎn)擊下一年和下一月問(wèn)題

    這篇文章主要介紹了解決antd日期選擇組件,添加value就無(wú)法點(diǎn)擊下一年和下一月問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • Vue中的Props(不可變狀態(tài))

    Vue中的Props(不可變狀態(tài))

    這篇文章主要介紹了Vue中的Props(不可變狀態(tài)),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-09-09
  • vue3?組件與API直接使用的方法詳解(無(wú)需import)

    vue3?組件與API直接使用的方法詳解(無(wú)需import)

    這篇文章主要介紹了vue3?組件與API直接使用的方法(無(wú)需import),主要包括vue3自動(dòng)導(dǎo)入和API的自動(dòng)引入問(wèn)題,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • Vue實(shí)現(xiàn)組件間通信的幾種方式(多種場(chǎng)景)

    Vue實(shí)現(xiàn)組件間通信的幾種方式(多種場(chǎng)景)

    本文主要介紹了Vue實(shí)現(xiàn)組件間通信的幾種方式,不同的場(chǎng)景使用不同的方式,基本滿(mǎn)足所有開(kāi)發(fā)場(chǎng)景中的通信需求,感興趣的可以了解一下
    2021-10-10

最新評(píng)論