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

vue正確使用watch監(jiān)聽屬性變化方式

 更新時間:2022年04月30日 12:06:52   作者:劉文壯  
這篇文章主要介紹了vue正確使用watch監(jiān)聽屬性變化方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Vue中可以使用監(jiān)聽器監(jiān)聽屬性的變化,并根據(jù)屬性變化作出響應(yīng)。但一旦涉及到復(fù)雜數(shù)據(jù)的監(jiān)聽(如Object,但數(shù)組一般不需要,因?yàn)閂ue針對數(shù)組做了特殊處理)時就比較復(fù)雜了,本文解釋了使用watch監(jiān)聽屬性變化的方法,包括復(fù)雜數(shù)據(jù)。

基本用法

Vue watch最重要的使用場景是根據(jù)某屬性的變化執(zhí)行某些業(yè)務(wù)邏輯:

<template>
? <input type="number" v-model.number="counter" />
</template>
<script>
export default {
? name: "Counter",
? data: function() {
? ? return {
? ? ? counter: 0,
? ? };
? },
? watch: {
? ? counter: function(newV, oldV) {
? ? ? console.log('counter change to %d from %d', newV, oldV);
? ? },
? }
};
</script>

watch的基本用法很簡單:針對需要監(jiān)聽的屬性定義個同名的函數(shù)即可,函數(shù)的第一個參數(shù)為變化后的值,第二個參數(shù)為變化前的值。

監(jiān)聽object

首先我們回顧一個JavaScript中的概念:復(fù)雜數(shù)據(jù)變量。“復(fù)雜”的原因在于變量只是一個引用,和C++中的指針類似,其保存的不是真實(shí)的數(shù)據(jù),而是數(shù)據(jù)的地址。

比如對于一個object變量來說,添加屬性、刪除屬性、修改屬性的值都不會改變這個地址,這也可以說這個object變量沒有變化。

不管所用的框架如何,基本定理肯定是生效的,所以Vue中監(jiān)聽object也是一難題,特別是嵌套數(shù)據(jù)的監(jiān)聽。

這里的變化指的是地址的變化,能夠觸發(fā)變化最簡單的方式就是重新賦值。

<template>
? <div>
? ? <label>up trigger {{ counter.up }} times</label>
? ? <button @click="onTrigger('up')">Trigger Up</button>
? ? <br>
? ? <label>down trigger {{ counter.down }} times</label>
? ? <button @click="onTrigger('down')">Trigger down</button>
? </div>
</template>
<script>
export default {
? name: "Counter",
? data: function() {
? ? return {
? ? ? counter: {
? ? ? ? up: 0,
? ? ? ? down: 0,
? ? ? },
? ? };
? },
? methods: {
? ? onTrigger: function(type) {
? ? ? this.counter[type] += 1;
? ? }
? },
? watch: {
? ? counter: function(newV, oldV) {
? ? ? // 不會被觸發(fā)
? ? ? console.log('counter change to %o from %o', newV, oldV);
? ? },
? }
};
</script>

針對counter的監(jiān)聽不會被觸發(fā),因?yàn)閠his.counter[type] += 1;并不會使this.counter變化(地址沒變)。那如果想要監(jiān)聽到這個變化應(yīng)該怎么辦呢?一般來說有兩種方式:

使用deep參數(shù)

watch: {
? counter: {
? ? handler: function(newV, oldV) {
? ? ? console.log('counter change to %o from %o', newV, oldV);
? ? },
? ? deep: true,
? }
}

使用deep需要使用watch的完整形式:handler是監(jiān)聽回調(diào)函數(shù),deep: true指定了不僅僅監(jiān)聽counter的變化,也監(jiān)聽其內(nèi)部屬性的變化,所以當(dāng)counter.up或counter.down變化時才能出發(fā)handler回調(diào)。

重新賦值

methods: {
? onTrigger: function(type) {
? ? // 重新賦值觸發(fā)變化
? ? this.counter = {
? ? ? ...this.counter,
? ? ? [type]: this.counter[type] + 1,
? ? };
? }
},
watch: {
? counter: function(newV, oldV) {
? ? // 不會被觸發(fā)
? ? console.log('counter change to %o from %o', newV, oldV);
? },
}

那兩種方式優(yōu)劣如何呢?使用deep參數(shù)會為數(shù)據(jù)每一層都添加監(jiān)聽,當(dāng)層級較深時比較耗費(fèi)性能,而且Vue不能監(jiān)聽到屬性的添加或刪除

所以一般來說使用重新賦值的方式是較優(yōu)的方案,但如果只是想監(jiān)聽內(nèi)部嵌

套數(shù)據(jù)的話,重新賦值就比較重了,所以Vue也提供了直接監(jiān)聽嵌套屬性變化的途徑:

通過路徑監(jiān)聽內(nèi)部數(shù)據(jù)

watch: {
? 'counter.up': function(newV, oldV) {
? ? console.log('counter.up change to %d from %d', newV, oldV);
? },
? 'counter.down': function(newV, oldV) {
? ? console.log('counter.down change to %d from %d', newV, oldV);
? },
}

通過這種方式可以避免使用deep造成的性能消耗問題,當(dāng)只對某內(nèi)部屬性變化作出響應(yīng)的場景下比較合適,但仍要注意監(jiān)聽的路徑數(shù)據(jù)仍是復(fù)雜數(shù)據(jù)時的場景。

初始化變量觸發(fā)監(jiān)聽回調(diào)

使用watch監(jiān)聽變化時,給變量初始值不會觸發(fā)監(jiān)聽函數(shù),如果像要改變這個默認(rèn)設(shè)定可以使用immediate參數(shù),其用法和deep類似:

watch: {
? counter: {
? ? handler: function(newV, oldV) {
? ? ? console.log('counter change to %o from %o', newV, oldV);
? ? },
? ? immediate: true,
? }
}

這樣在賦初值時就會觸發(fā)監(jiān)聽函數(shù),其中第一個參數(shù)為初始值,第二個參數(shù)為undefined。

總結(jié)

使用watch可以監(jiān)聽屬性的變化,且其使用方式也不少,理解每種方式的使用場景能為開發(fā)節(jié)省時間,優(yōu)化性能。

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何使用VuePress搭建一個類型element ui文檔

    如何使用VuePress搭建一個類型element ui文檔

    這篇文章主要介紹了如何使用VuePress搭建一個類型element ui文檔,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • 使用vue-cli導(dǎo)入Element UI組件的方法

    使用vue-cli導(dǎo)入Element UI組件的方法

    這篇文章給大家介紹了使用vue-cli導(dǎo)入Element UI組件的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友一起看看吧
    2018-05-05
  • vue2.0 axios前后端數(shù)據(jù)處理實(shí)例代碼

    vue2.0 axios前后端數(shù)據(jù)處理實(shí)例代碼

    本篇文章主要介紹了vue2.0 axios前后端數(shù)據(jù)處理實(shí)例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Element Rate 評分的使用方法

    Element Rate 評分的使用方法

    這篇文章主要介紹了Element Rate 評分的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 淺析vue3的setup的使用和原理

    淺析vue3的setup的使用和原理

    setup是Vue3中引入的一個新的組件選項(xiàng),是Vue3中函數(shù)式組件的核心部分,它提供了一種新的方式來編寫組件邏輯,下面就來和大家講講它的使用和原理
    2023-08-08
  • VuePress在build打包時window?document?is?not?defined問題解決

    VuePress在build打包時window?document?is?not?defined問題解決

    這篇文章主要為大家介紹了VuePress在build打包時window?document?is?not?defined問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Vue 3 + Element Plus樹形表格全選多選及子節(jié)點(diǎn)勾選的問題解決方法

    Vue 3 + Element Plus樹形表格全選多選及子節(jié)點(diǎn)勾選的問題解決方

    在本文中,我們解決了Vue 3和Element Plus樹形表格中的全選、多選、子節(jié)點(diǎn)勾選和父節(jié)點(diǎn)勾選等常見問題,通過逐步實(shí)現(xiàn)這些功能,您可以構(gòu)建功能強(qiáng)大且用戶友好的樹形表格組件,以滿足各種數(shù)據(jù)展示需求,對Vue 3 Element Plus樹形表格相關(guān)知識感興趣的朋友一起看看吧
    2023-12-12
  • 詳解Vue中狀態(tài)管理Vuex

    詳解Vue中狀態(tài)管理Vuex

    vuex是一個專門為vue.js設(shè)計(jì)的狀態(tài)管理模式,并且也可以使用devtools進(jìn)行調(diào)試。
    2017-05-05
  • vue中使用vee-validator完成表單校驗(yàn)方案

    vue中使用vee-validator完成表單校驗(yàn)方案

    vee-validator是一種基于vue模板的輕量級校驗(yàn)框架。本文主要討論的是vee-validator校驗(yàn)方案,感興趣的朋友跟隨小編一起看看吧
    2019-11-11
  • Vue 和 React 使用ref的示例詳解

    Vue 和 React 使用ref的示例詳解

    在 Vue 中,ref 是一個響應(yīng)式對象,修改 ref 的值會觸發(fā)組件的重新渲染,因?yàn)?nbsp;Vue 的 ref 是基于其響應(yīng)式系統(tǒng)實(shí)現(xiàn)的,任何對 ref 的修改都會被 Vue 檢測到,并觸發(fā)組件的更新,本文給大家介紹Vue 和 React 使用ref的示例,感興趣的朋友一起看看吧
    2025-04-04

最新評論

门头沟区| 元谋县| 礼泉县| 慈利县| 兴安盟| 疏勒县| 定日县| 高青县| 宣化县| 凌云县| 绥滨县| 邵阳县| 扎囊县| 道孚县| 喜德县| 九寨沟县| 登封市| 昔阳县| 石阡县| 阿克陶县| 宁远县| 饶阳县| 出国| 萝北县| 余姚市| 新昌县| 惠安县| 丰镇市| 姚安县| 文成县| 邵阳市| 微博| 丁青县| 汶上县| 丹寨县| 桂林市| 共和县| 巩留县| 芮城县| 儋州市| 独山县|