欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在Vue中實現(xiàn)深度監(jiān)聽的示例代碼

 更新時間:2025年03月03日 09:25:42   作者:2301_76303308  
在 Vue 中,深度監(jiān)聽是指監(jiān)聽一個對象或數(shù)組的嵌套屬性(深層結(jié)構(gòu))的變化,而不僅僅是監(jiān)聽頂層屬性的引用變化,本文給大家介紹了如何在Vue中實現(xiàn)深度監(jiān)聽,并通過代碼示例介紹的非常詳細,需要的朋友可以參考下

一、什么是深度監(jiān)聽?

在 Vue 中,深度監(jiān)聽是指監(jiān)聽一個對象或數(shù)組的嵌套屬性(深層結(jié)構(gòu))的變化,而不僅僅是監(jiān)聽頂層屬性的引用變化。Vue 的響應(yīng)式系統(tǒng)默認只監(jiān)聽對象的淺層屬性(即直接屬性),如果需要監(jiān)聽對象內(nèi)部的嵌套屬性變化,就需要啟用 深度監(jiān)聽。

二、實現(xiàn)深度監(jiān)聽的方法

Vue 提供了 watch 選項(或 @watch 裝飾器)來監(jiān)聽數(shù)據(jù)變化,通過設(shè)置 deep: true 可以實現(xiàn)深度監(jiān)聽。以下是具體實現(xiàn)方式:

1. 使用 watch 選項

語法

watch: {
  // 監(jiān)聽的對象
  obj: {
    handler(newVal, oldVal) {
      console.log('obj 變化了:', newVal, oldVal);
    },
    deep: true // 開啟深度監(jiān)聽
  }
}

完整示例

new Vue({
  el: '#app',
  data() {
    return {
      obj: {
        a: 1,
        b: {
          c: 2
        }
      }
    };
  },
  watch: {
    obj: {
      handler(newVal, oldVal) {
        console.log('obj 更新:', newVal);
      },
      deep: true
    }
  },
  methods: {
    changeObj() {
      this.obj.b.c = 3; // 修改深層屬性
    }
  }
});
    • 效果:當 obj.b.c 變?yōu)?3 時,watch 的 handler 會被觸發(fā),輸出新值。
  • 說明

    • deep: true 會遞歸遍歷 obj 的所有嵌套屬性,確保任何深層變化都能觸發(fā)監(jiān)聽。
    • handler 接收新值和舊值,但由于深層對象是引用類型,newVal 和 oldVal 可能是同一個對象(僅內(nèi)容不同)。

2. 使用 $watch 方法

  • 語法
this.$watch('obj', (newVal, oldVal) => {
  console.log('obj 變化:', newVal);
}, {
  deep: true
});
  • 完整示例
new Vue({
  el: '#app',
  data() {
    return {
      obj: {
        a: 1,
        b: { c: 2 }
      }
    };
  },
  mounted() {
    this.$watch('obj', (newVal, oldVal) => {
      console.log('obj 更新:', newVal);
    }, {
      deep: true
    });
  },
  methods: {
    changeObj() {
      this.obj.b.c = 3;
    }
  }
});
  • 效果:與 watch 選項相同,監(jiān)聽深層變化。

3. 監(jiān)聽特定嵌套屬性(避免深度監(jiān)聽)

  • 原理:如果只關(guān)心某個深層屬性,可以直接監(jiān)聽其路徑,無需 deep。
  • 代碼
watch: {
  'obj.b.c'(newVal, oldVal) {
    console.log('obj.b.c 變化:', newVal, oldVal);
  }
}
  • 效果:僅當 obj.b.c 變化時觸發(fā),不監(jiān)聽其他屬性。
  • 優(yōu)點:性能更高,避免不必要的遞歸監(jiān)聽。

三、深度監(jiān)聽的工作原理

  • Vue 的響應(yīng)式系統(tǒng)基于 Object.defineProperty(Vue 2)或 Proxy(Vue 3)。
  • 默認情況下,只有對象頂層屬性被設(shè)置為響應(yīng)式,嵌套屬性的 setter/getter 需通過 deep: true 遞歸綁定。
  • 當 deep: true 啟用時,Vue 會遍歷對象的所有屬性,添加監(jiān)聽器,確保深層變化可被檢測。

四、注意事項

  • 性能開銷
    • deep: true 會遞歸監(jiān)聽所有嵌套屬性,對象越大,性能開銷越高。
    • 優(yōu)化建議:盡量監(jiān)聽具體屬性(如 'obj.b.c'),或拆分數(shù)據(jù)結(jié)構(gòu)。
  • 新舊值問題
    • 深度監(jiān)聽時,newVal 和 oldVal 是同一個引用,需深拷貝比較差異:
handler(newVal) {
  const oldVal = JSON.parse(JSON.stringify(newVal));
  // 比較邏輯
}

數(shù)組特殊情況

  • 數(shù)組的嵌套對象也支持深度監(jiān)聽,但數(shù)組本身的push等方法已默認響應(yīng)式,無需 deep。
  • 示例:
watch: {
  'arr[0].a': {
    handler(newVal) {
      console.log('arr[0].a 變化:', newVal);
    },
    deep: true
  }
}
  • Vue 3 差異
    • Vue 3 使用 Proxy,深度監(jiān)聽更高效,但用法一致。

五、實際應(yīng)用場景

  • 表單數(shù)據(jù):監(jiān)聽復(fù)雜表單對象的變化,實時校驗。
watch: {
  form: {
    handler(newVal) {
      this.validateForm(newVal);
    },
    deep: true
  }
}
  • 狀態(tài)管理:監(jiān)聽嵌套狀態(tài)(如 Vuex 的 state),觸發(fā)更新。
  • 動態(tài)配置:監(jiān)聽配置對象的變化,調(diào)整 UI。

六、面試擴展

如果面試官追問,我可以補充:

替代方案:用 computed 計算屬性配合 watch

computed: {
  objComputed() {
    return JSON.stringify(this.obj); // 轉(zhuǎn)為字符串比較
  }
},
watch: {
  objComputed(newVal, oldVal) {
    console.log('obj 變化:', newVal);
  }
}

性能優(yōu)化:結(jié)合 immediate: true(初始觸發(fā))或防抖(debounce):

watch: {
  obj: {
    handler: _.debounce(function(newVal) {
      console.log('節(jié)流更新:', newVal);
    }, 300),
    deep: true
  }
}

七、總結(jié)

  • 核心方法watch 或 $watch 設(shè)置 deep: true。
  • 推薦實踐:優(yōu)先監(jiān)聽具體屬性,必要時用深度監(jiān)聽并優(yōu)化性能。
  • 代碼示例已覆蓋常見場景,面試中可根據(jù)需求調(diào)整。

到此這篇關(guān)于在Vue中實現(xiàn)深度監(jiān)聽的示例代碼的文章就介紹到這了,更多相關(guān)Vue深度監(jiān)聽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vuex提升學(xué)習(xí)篇

    Vuex提升學(xué)習(xí)篇

    本篇文章主要介紹了Vuex提升學(xué)習(xí)篇,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • 關(guān)于Vue中的計算屬性和監(jiān)聽屬性詳解

    關(guān)于Vue中的計算屬性和監(jiān)聽屬性詳解

    這篇文章主要介紹了關(guān)于Vue中的計算屬性和監(jiān)聽屬性詳解,Vue.js模板內(nèi)的表達式非常便利,但是設(shè)計它們的初衷是用于簡單運算的,在模板內(nèi)放入過長的或復(fù)雜的邏輯時,會讓模板過重且難以維護,需要的朋友可以參考下
    2023-05-05
  • Vue2.0+Vux搭建一個完整的移動webApp項目的示例

    Vue2.0+Vux搭建一個完整的移動webApp項目的示例

    這篇文章主要介紹了Vue2.0+Vux搭建一個完整的移動webApp項目的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • Vue中的情侶屬性$dispatch和$broadcast詳解

    Vue中的情侶屬性$dispatch和$broadcast詳解

    這篇文章主要給大家介紹了關(guān)于Vue中情侶屬性$dispatch和$broadcast的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Vue2?this?能夠直接獲取到?data?和?methods?的原理分析

    Vue2?this?能夠直接獲取到?data?和?methods?的原理分析

    這篇文章主要介紹了Vue2?this能夠直接獲取到data和methods的原理分析,因為methods里的方法通過bind指定了this為new?Vue的實例
    2022-06-06
  • vue-element如何實現(xiàn)動態(tài)換膚存儲

    vue-element如何實現(xiàn)動態(tài)換膚存儲

    這篇文章主要介紹了vue-element如何實現(xiàn)動態(tài)換膚存儲問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Swiper在Vue2中的簡單使用方法

    Swiper在Vue2中的簡單使用方法

    這篇文章主要給大家介紹了關(guān)于Swiper在Vue2中的簡單使用方法,swiper是一款現(xiàn)代化的移動端輪播組件,可以在Vue中輕松使用,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • el-form-renderer使用教程

    el-form-renderer使用教程

    本文主要介紹了el-form-renderer使用教程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Vue使用v-model收集各種表單數(shù)據(jù)、過濾器的示例詳解

    Vue使用v-model收集各種表單數(shù)據(jù)、過濾器的示例詳解

    這篇文章主要介紹了Vue使用v-model收集各種表單數(shù)據(jù)、過濾器的示例,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • vue中如何通過函數(shù)傳參數(shù)

    vue中如何通過函數(shù)傳參數(shù)

    這篇文章主要介紹了vue中如何通過函數(shù)傳參數(shù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評論