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

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

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

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

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

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

Vue 提供了 watch 選項(或 @watch 裝飾器)來監(jiān)聽數據變化,通過設置 deep: true 可以實現深度監(jiā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 可能是同一個對象(僅內容不同)。

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

  • 原理:如果只關心某個深層屬性,可以直接監(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 的響應式系統(tǒng)基于 Object.defineProperty(Vue 2)或 Proxy(Vue 3)。
  • 默認情況下,只有對象頂層屬性被設置為響應式,嵌套屬性的 setter/getter 需通過 deep: true 遞歸綁定。
  • 當 deep: true 啟用時,Vue 會遍歷對象的所有屬性,添加監(jiān)聽器,確保深層變化可被檢測。

四、注意事項

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

數組特殊情況

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

五、實際應用場景

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

六、面試擴展

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

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

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

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

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

七、總結

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

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

相關文章

  • vant組件中 dialog的確認按鈕的回調事件操作

    vant組件中 dialog的確認按鈕的回調事件操作

    這篇文章主要介紹了vant組件中 dialog的確認按鈕的回調事件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Vue 實現一個簡單的鼠標拖拽滾動效果插件

    Vue 實現一個簡單的鼠標拖拽滾動效果插件

    這篇文章主要介紹了Vue 實現一個簡單的鼠標拖拽滾動效果插件,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2020-12-12
  • .eslintrc配置目錄及配置項的使用方式

    .eslintrc配置目錄及配置項的使用方式

    這篇文章主要介紹了.eslintrc配置目錄及配置項的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 實例分析vue循環(huán)列表動態(tài)數據的處理方法

    實例分析vue循環(huán)列表動態(tài)數據的處理方法

    本篇文章給大家詳細分享了關于vue循環(huán)列表動態(tài)數據的處理方法以及相關知識點內容,有需要的朋友們參考下。
    2018-09-09
  • Vue中插槽slot的使用示例詳解

    Vue中插槽slot的使用示例詳解

    這篇文章主要介紹了Vue中插槽slot的使用示例詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-05-05
  • vue .js綁定checkbox并獲取、改變選中狀態(tài)的實例

    vue .js綁定checkbox并獲取、改變選中狀態(tài)的實例

    今天小編就為大家分享一篇vue .js綁定checkbox并獲取、改變選中狀態(tài)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • uniapp嵌套webview無法返回上一級解決方式

    uniapp嵌套webview無法返回上一級解決方式

    uniapp是一款非常強大的跨平臺開發(fā)框架,它可以讓我們只編寫一份代碼,就能在多個平臺上運行,這篇文章主要給大家介紹了關于uniapp嵌套webview無法返回上一級的解決方式,需要的朋友可以參考下
    2024-05-05
  • 前端vue3?setup使用教程

    前端vue3?setup使用教程

    這篇文章主要為大家介紹了前端vue3架構setup使用教程,詳細介紹?setup?的用法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-02-02
  • vue.js配合$.post從后臺獲取數據簡單demo分享

    vue.js配合$.post從后臺獲取數據簡單demo分享

    今天小編就為大家?guī)硪黄獀ue.js配合$.post從后臺獲取數據簡單demo分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • Vue組件傳參11種方式舉例介紹

    Vue組件傳參11種方式舉例介紹

    這篇文章主要給大家介紹了關于Vue組件傳參11種方式的相關資料,文中通過代碼示例介紹的非常詳細,對大家學習或者使用vue具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09

最新評論

石阡县| 和硕县| 兴仁县| 遂昌县| 博湖县| 丹棱县| 连南| 苍南县| 卓资县| 香港 | 眉山市| 临桂县| 芦山县| 永嘉县| 塔城市| 阳信县| 酒泉市| 库尔勒市| 会东县| 镇赉县| 高尔夫| 施秉县| 兴隆县| 桂阳县| 大竹县| 岳普湖县| 奉新县| 潮安县| 城步| 繁峙县| 长垣县| 岑溪市| 湖南省| 南充市| 永昌县| 曲麻莱县| 舞钢市| 荆门市| 潢川县| 富阳市| 柘荣县|