最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue組件中使用防抖和節(jié)流實例分析

 更新時間:2021年11月26日 08:49:53   作者:青燈夜游  
在本篇文章里小編給大家整理的是一篇關于Vue組件中使用防抖和節(jié)流實例分析內(nèi)容,有需要的朋友們可以學習參考下。

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

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

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

1. 觀察者 防抖

我們先從一個簡單的組件開始,我們的任務是 將用戶輸入到 文本框中的文本 輸出到控制臺:

<template>
  <input v-model="value" type="text" />
  <p>{{ value }}</p>
</template>
<script>
export default {
  data() {
    return {
      value: "",
    };
  },
  watch: {
    value(newValue, oldValue) {
      console.log("Value changed: ", newValue);
    }
  }
};
</script>

打開demo:

https://codesandbox.io/s/vue-input-szgn1?file=/src/App.vue

打開 demo,在 輸入框 敲幾個字符。每次輸入時,值就會被 log 到控制臺。

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

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

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

我們來將 防抖邏輯 應用到組件:

<template>
  <input v-model="value" type="text" />
  <p>{{ value }}</p>
</template>
<script>
import debounce from "lodash.debounce";
export default {
  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>

試試 demo

https://codesandbox.io/s/vue-input-debounced-4vwex?file=/src/App.vue

如果你打開這個 demo,你會發(fā)現(xiàn)其實從用戶角度來看,變化不大:你依舊可以像上一個 demo 中一樣自由輸入字符。

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

觀察者 的 防抖實現(xiàn) 只需要 3 個簡單步驟:

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

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

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

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

2. 事件處理器 防抖

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

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

像往常一樣,如果你沒有采取任何緩沖的措施,每當值被修改時,會被打印到控制臺:

<template>
  <input v-on:input="handler" type="text" />
</template>
<script>
export default {
  methods: {
    handler(event) {
      console.log('New value:', event.target.value);
    }
  }
};
</script>

試試 demo:

https://codesandbox.io/s/vue-event-handler-plls4?file=/src/App.vue

打開這個 demo,在輸入框打幾個字符??纯纯刂婆_:你會發(fā)現(xiàn)每次你輸入的時候就會有日志被打印出來。

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

對 事件處理器 使用 防抖,可以參考下面這個:

<template>
  <input v-on:input="debouncedHandler" type="text" />
</template>
<script>
import debounce from "lodash.debounce";
export default {
  created() {
    this.debouncedHandler = debounce(event => {
      console.log('New value:', event.target.value);
    }, 500);
  },
  beforeUnmount() {
    this.debouncedHandler.cancel();
  }
};
</script>

試試 demo:

https://codesandbox.io/s/vue-event-handler-debounced-973vn?file=/src/App.vue

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

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

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

在輸入框的 template 中 給 v-on:input 賦上 debouncedHandler :

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

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

3. 注意

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

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

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

例如:

<template>
  <input v-on:input="debouncedHandler" type="text" />
</template>
<script>
import debounce from "lodash.debounce";
export default {
  methods: {
    // Don't do this!
    debouncedHandler: debounce(function(event) {
      console.log('New value:', event.target.value);
    }, 500)
  }
};
</script>

試試 demo

https://codesandbox.io/s/vue-event-handler-debounced-incorrectly-320ci?file=/src/App.vue

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

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

問題是,組件使用 export default { ... } 導出的 options 對象,包括方法,會被組件實例重用。

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

4. 總結(jié)

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

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

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

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

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

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

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

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

到此這篇關于Vue組件中使用防抖和節(jié)流實例分析的文章就介紹到這了,更多相關淺析Vue組件使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • vue prop屬性傳值與傳引用示例

    vue prop屬性傳值與傳引用示例

    今天小編就為大家分享一篇vue prop屬性傳值與傳引用示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • vue3實現(xiàn)淘寶放大鏡效果的示例代碼

    vue3實現(xiàn)淘寶放大鏡效果的示例代碼

    放大鏡效果在很多購物網(wǎng)站都可以看到,本文主要介紹了vue3實現(xiàn)淘寶放大鏡效果的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • vue+elementUI實現(xiàn)點擊左右箭頭切換按鈕功能

    vue+elementUI實現(xiàn)點擊左右箭頭切換按鈕功能

    這篇文章主要介紹了vue+elementUI實現(xiàn)點擊左右箭頭切換按鈕功能,樣式可以根據(jù)自己需求改動,感興趣的朋友可以參考下實現(xiàn)代碼
    2024-05-05
  • vue使用xe-utils函數(shù)庫的具體方法

    vue使用xe-utils函數(shù)庫的具體方法

    這篇文章主要介紹了vue使用xe-utils函數(shù)庫的具體方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • vue?如何刪除數(shù)組中的某一條數(shù)據(jù)

    vue?如何刪除數(shù)組中的某一條數(shù)據(jù)

    這篇文章主要介紹了vue?如何刪除數(shù)組中的某一條數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 查看vue版本號以及vue/cli腳手架版本號方式

    查看vue版本號以及vue/cli腳手架版本號方式

    這篇文章主要介紹了查看vue版本號以及vue/cli腳手架版本號方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vue3動態(tài)路由+菜單欄的實現(xiàn)示例

    vue3動態(tài)路由+菜單欄的實現(xiàn)示例

    在后臺管理系統(tǒng),可以根據(jù)登錄用戶的不同返回不同路由,頁面也會根據(jù)這些路由生成對應的菜單,本文主要介紹了vue3動態(tài)路由+菜單欄的實現(xiàn)示例,感興趣的可以了解一下
    2024-04-04
  • vue?過濾、模糊查詢及計算屬性?computed詳解

    vue?過濾、模糊查詢及計算屬性?computed詳解

    計算屬性是vue里面為了簡化在模板語法中對響應式屬性做計算而存在的,這篇文章主要介紹了vue?過濾、模糊查詢(計算屬性?computed),需要的朋友可以參考下
    2022-11-11
  • Vue?使用postMessage?實現(xiàn)父子跨域通信

    Vue?使用postMessage?實現(xiàn)父子跨域通信

    這篇文章主要介紹了Vue應用?postMessage?實現(xiàn)父子跨域通信,通過示例介紹了postMessage的使用,本文結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • 基于Vuejs框架實現(xiàn)翻頁組件

    基于Vuejs框架實現(xiàn)翻頁組件

    這篇文章主要為大家詳細介紹了基于VueJs框架的翻頁組件,小巧精致,性能優(yōu)異的MVVM框架實現(xiàn)翻頁組件,也適用于angular,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11

最新評論

澎湖县| 休宁县| 临汾市| 大兴区| 军事| 临高县| 广河县| 勐海县| 杭锦后旗| 犍为县| 谢通门县| 平安县| 兰溪市| 中江县| 赫章县| 古浪县| 托克托县| 新绛县| 邵武市| 上高县| 清流县| 项城市| 巴东县| 淅川县| 遵义市| 淮北市| 麻阳| 沈阳市| 玉树县| 平定县| 类乌齐县| 湄潭县| 交口县| 雷波县| 张家口市| 云浮市| 惠安县| 黄陵县| 额济纳旗| 阳信县| 朝阳市|