国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

溜到飛起,在 Vue 中使用防抖和節(jié)流

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

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

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

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

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

1. 觀察者 防抖

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

<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>

打開(kāi)demo[2]

打開(kāi) demo,在 輸入框 敲幾個(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>
<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[3]

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

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

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

  1. 在 create() 鉤子 里,創(chuàng)建 防抖回調(diào),并將其賦值到實(shí)例上:this.debouncedWatch = debounce(..., 500)。
  2. 在 觀察者 回調(diào) watch.value() { ... } 中 傳入正確的參數(shù) 調(diào)用 this.debouncedWatch()。
  3. 最后,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ī)的事件處理器呢?

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

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

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

試試 demo[4]

打開(kāi)這個(gè) demo,在輸入框打幾個(gè)字符。看看控制臺(tái):你會(huì)發(fā)現(xiàn)每次你輸入的時(shí)候就會(huì)有日志被打印出來(lái)。

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

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

<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[5]

打開(kāi) demo,輸入一些字符。組件只有在最后一次輸入的 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>
<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[6]

這次不是在 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>
<input v-on:input="debouncedHandler" type="text" />
</template>

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

責(zé)任編輯:龐桂玉 來(lái)源: 前端大全
相關(guān)推薦

2023-12-18 07:37:17

JavaScript防抖節(jié)流

2023-12-21 08:51:37

防抖節(jié)流Vue.js

2019-09-02 08:58:27

Python編譯器編程語(yǔ)言

2024-03-08 08:26:20

防抖節(jié)流delay?

2021-08-03 06:57:36

Js事件節(jié)流

2024-10-12 09:33:24

消息隊(duì)列多線程并行編程

2020-10-14 12:29:51

開(kāi)源圖表 開(kāi)發(fā)

2024-06-14 09:30:58

2017-07-14 10:10:08

Vue.jsMixin

2022-04-01 07:52:42

JavaScript防抖節(jié)流

2025-06-19 00:02:00

防抖節(jié)流函數(shù)

2021-11-19 09:01:09

防抖節(jié)流前端

2025-05-09 08:00:00

JavaScript代碼防抖節(jié)流

2020-09-14 14:18:05

Vue和React

2017-06-13 10:15:16

iMac蘋(píng)果iMac Pro

2017-06-05 14:35:45

2025-05-06 09:35:00

2021-04-17 18:24:04

Vue.js嵌套路由前端

2021-09-07 10:24:36

Vue應(yīng)用程序Web Workers

2018-11-26 09:20:26

GrailsjQueryDataTables
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

黄色工厂这里只有精品| 亚洲精品videosex极品| 国产精品日韩在线一区| 在线中文字幕播放| 亚洲成a人片综合在线| 九一精品在线观看| va亚洲va日韩不卡在线观看| 五码日韩精品一区二区三区视频| 欧美日韩国产亚洲一区| 国产精品成av人在线视午夜片| 美女福利视频在线| 免费污视频在线一区| 亚洲国产精品嫩草影院久久av| 精品国产鲁一鲁一区二区张丽| 日本熟妇人妻xxxxx| 高潮一区二区| 蜜桃av噜噜一区二区三区小说| 亚洲国产sm捆绑调教视频 | 国产一区二区三区久久精品| 精品国产白色丝袜高跟鞋| 精品国产乱码久久久久酒店 | 婷婷六月激情| **精品中文字幕一区二区三区| 日韩欧美激情电影| 激情av综合网| 在线观看欧美视频| 亚洲在线免费看| www.亚洲成人网| 91精品国产91久久久久游泳池 | 国产视频亚洲精品| 美女国产在线| 欧美一卡二卡三卡四卡| 污污的网站在线看| 亚洲成人激情图| 一区二区三区电影大全| 日韩中文字幕网| 韩国精品福利一区二区三区| 日韩美女主播视频| 91精品福利| 精品国产乱码久久久久久郑州公司| 久久男女视频| 欧美视频在线观看网站 | 日韩一区二区高清视频| 成人激情动漫在线观看| 国产成人av影视| 亚洲一区二区三区自拍| 成在在线免费视频| 亚洲女同性videos| 欧美亚视频在线中文字幕免费| 91久久在线播放| 日本欧美一区二区三区乱码| 奇米影视亚洲色图| 国产欧美一区二区精品秋霞影院| 天堂在线看视频| 91麻豆精品国产| 97成人超碰| 国产精品丝袜视频| 免费观看成人鲁鲁鲁鲁鲁视频| 免费在线观看亚洲视频| 调教+趴+乳夹+国产+精品| 欧美videossex另类| 久久69精品久久久久久久电影好| 久久亚洲精品中文字幕蜜潮电影| 欧美成人综合一区| 欧美激情综合五月色丁香| 久蕉在线视频| 中文字幕亚洲国产| 亚洲国产精品久久久天堂| 中文字幕在线中文| 亚洲午夜av在线| 欧美magnet| 91视频-88av| 成人免费视频视频| 欧美另类自拍| 久久久999精品| 欧美午夜不卡影院在线观看完整版免费| 最新欧美日韩亚洲| 亚洲国产日韩精品| 91看片一区| 91视频-88av| 91尤物视频在线观看| 在线国产91| 97在线看福利| 激情综合网最新| 黄色av免费在线观看| 欧美人与物videos| 精品在线一区二区| 国产精品影院在线| 欧美一级黄色网| 成人99免费视频| h片在线免费观看| 国产乱肥老妇国产一区二| 99久久精品国产导航| 亚洲91av| 91香蕉亚洲精品| 国产区在线观看成人精品| 久久一卡二卡| 999热视频在线观看| 中文字幕+乱码+中文字幕一区| 黄色aa久久| 蜜桃传媒视频第一区入口在线看| 一区二区三区四区激情| 人人精品久久| 亚洲精品一品区二品区三品区 | 白嫩少妇丰满一区二区| 精品播放一区二区| 欧美日韩天堂| 国产黄色一级电影| 久久这里有精品| 激情综合五月婷婷| 色yeye免费人成网站在线观看| 亚洲a∨日韩av高清在线观看| 国产精品每日更新| 亚洲欧美在线人成swag| 在线观看视频黄色| 欧美老女人在线| 女生裸体视频一区二区三区| 最新中文字幕av专区| 国内精品中文字幕| 国产区在线观看成人精品| 人人精品久久| 免费观看精品视频| 日韩中文字幕在线看| 国产精品一区二区久久不卡 | 欧美艳星brazzers| 久久精品国内一区二区三区水蜜桃| 一区二区三区 日韩| 久久综合国产精品台湾中文娱乐网| 精一区二区三区| 九色porny丨首页入口在线| 日本成人看片网址| 欧美精品一区视频| 久久超碰97中文字幕| 91吃瓜在线观看| 青草全福视在线| 精品一区电影国产| 国产白丝精品91爽爽久久| 日韩伦理三区| 免费看国产一级片| 中文字幕亚洲综合| 91麻豆swag| 网站一区二区| 成人免费网址在线| 国产精品视频自在线| 色偷偷成人一区二区三区91 | 丁香五精品蜜臀久久久久99网站| 九色porny丨首页入口在线| 在线观看一区欧美| 亚洲区中文字幕| 97精品国产露脸对白| 免费看久久久| 一级黄色在线| 久久99导航| 亚洲国产日韩欧美在线动漫| 高潮精品一区videoshd| 成人av综合网| 伊人永久在线| 欧美日韩一区二区视频在线| 国产视频自拍一区| 国产午夜亚洲精品不卡| 国产一区二区三区四区二区| 国产高清视频在线观看| 日韩一二三区不卡在线视频| 最近日韩中文字幕中文| 亚洲欧美国产三级| 一区在线播放| 成人av观看| 成年人羞羞的网站| 国产一区二区三区色淫影院| 亚洲精品自拍视频| 国产精品传媒在线| 欧美午夜在线| 成人直播视频| 性综艺节目av在线播放| 欧美精品中文字幕一区二区| 中文字幕在线日韩| 亚洲午夜免费视频| 丝袜国产日韩另类美女| 六九午夜精品视频| 亚洲aⅴ优女av综合久久久| 在线观看免费黄色片| 欧美一级淫片aaaaaaa视频| 欧美麻豆精品久久久久久| 成人av先锋影音| 亚洲色图网站| 国产精品久久乐| 国产乱人伦精品一区二区| 特级毛片在线观看| 久久国产精品高清一区二区三区| 久久久pmvav| sis001欧美| 久草在线中文888| 99在线视频免费观看| 亚洲精品国产精品国产自| 久久影院午夜论| 国产中文一区| 蜜桃在线一区| av在线看片| 黄色毛片视频| www.国产二区|