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

Vue監(jiān)視數(shù)據(jù)的原理和set()的使用方法示例

 更新時間:2025年09月06日 13:53:41   作者:楓葉是圓的  
Vue.set方法用于向響應式對象中添加新的屬性,并確保這個新屬性是響應式的,這篇文章主要介紹了Vue監(jiān)視數(shù)據(jù)的原理和set()使用方法的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

前言

在 Vue 中,Vue.set()(或 this.$set())是用于解決響應式數(shù)據(jù)更新檢測的重要方法,其底層與 Vue 的數(shù)據(jù)監(jiān)視原理緊密相關(guān)。以下從使用場景和實現(xiàn)原理兩方面詳細說明:

一、Vue.set () 的使用場景與用法

1. 為什么需要 Vue.set ()?

Vue 的響應式系統(tǒng)通過 Object.defineProperty(Vue 2)或 Proxy(Vue 3)實現(xiàn)數(shù)據(jù)監(jiān)聽,但存在限制:

  • 無法檢測對象新增的屬性刪除的屬性
  • 無法檢測數(shù)組通過索引修改元素修改數(shù)組長度的操作。

此時,直接修改數(shù)據(jù)不會觸發(fā)視圖更新,需要用 Vue.set() 強制觸發(fā)響應式更新。

2. 用法

  • 語法
    // 全局方法
    Vue.set(target, propertyName/index, value)
    
    // 實例方法(組件內(nèi))
    this.$set(target, propertyName/index, value)
    
  • 參數(shù)
    • target:需要修改的響應式對象或數(shù)組(必須是已被 Vue 響應式系統(tǒng)劫持的對象);
    • propertyName/index:新增 / 修改的屬性名(對象)或索引(數(shù)組);
    • value:對應的值。

3. 典型場景

  • 給對象新增響應式屬性

    data() {
      return {
        user: { name: '張三' }
      }
    },
    methods: {
      addAge() {
        // 直接新增屬性,視圖不會更新
        this.user.age = 20; // 無效
        
        // 使用 $set,視圖會更新
        this.$set(this.user, 'age', 20); // 有效
      }
    }
    
  • 修改數(shù)組的指定元素

    data() {
      return {
        list: ['蘋果', '香蕉']
      }
    },
    methods: {
      updateItem() {
        // 直接通過索引修改,視圖不會更新
        this.list[1] = '橙子'; // 無效
        
        // 使用 $set,視圖會更新
        this.$set(this.list, 1, '橙子'); // 有效
      }
    }
    

二、Vue 監(jiān)視數(shù)據(jù)的原理

Vue 實現(xiàn)數(shù)據(jù)響應式的核心是對數(shù)據(jù)進行劫持,并在數(shù)據(jù)變化時通知依賴更新視圖。不同 Vue 版本的實現(xiàn)方式略有差異:

1. Vue 2 的響應式原理(Object.defineProperty)

  • 初始化劫持
    當組件初始化時,Vue 會遍歷 data 中的所有屬性,通過 Object.defineProperty 為每個屬性添加 getter 和 setter

    • getter:當屬性被訪問時觸發(fā),用于收集依賴(記錄哪些視圖 / 計算屬性依賴該數(shù)據(jù))。
    • setter:當屬性被修改時觸發(fā),用于通知依賴更新(觸發(fā)視圖重新渲染)。
  • 局限性

    • 只能劫持初始化時已存在的屬性,新增屬性默認沒有 getter/setter,因此無法被監(jiān)測。
    • 數(shù)組的 length 修改和索引賦值不會觸發(fā) setter(Vue 對數(shù)組的 7 個方法進行了重寫,如 push、splice 等,這些方法會觸發(fā)更新,但直接修改索引 / 長度不會)。

2. Vue 3 的響應式原理(Proxy)

  • 初始化劫持
    Vue 3 使用 ES6 的 Proxy 對 data 對象進行代理,生成一個代理對象(Proxy)。Proxy 可以攔截對象的所有操作(包括新增屬性、刪除屬性、索引訪問等),從而解決了 Vue 2 的局限性。

  • 優(yōu)勢

    • 能監(jiān)測新增屬性proxy.xxx = value 會被 set 攔截);
    • 能監(jiān)測刪除屬性delete proxy.xxx 會被 deleteProperty 攔截);
    • 能監(jiān)測數(shù)組索引修改長度變化(通過 set 攔截)。

三、Vue.set () 的底層實現(xiàn)邏輯

Vue.set() 的核心作用是手動為數(shù)據(jù)添加響應式能力,并觸發(fā)更新:

  • 對于對象

    • 檢查目標對象是否為響應式對象(是否有 __ob__ 標識,Vue 內(nèi)部用于標記響應式對象)。
    • 若屬性已存在,則直接修改值并觸發(fā) setter
    • 若屬性不存在,則通過 Object.defineProperty(Vue 2)或 Proxy 的 set 攔截(Vue 3)為新屬性添加響應式,并手動觸發(fā)依賴更新。
  • 對于數(shù)組

    • 調(diào)用數(shù)組的 splice 方法(Vue 已重寫該方法,會觸發(fā)更新),通過 splice(index, 1, value) 實現(xiàn)元素修改,從而觸發(fā)視圖更新。

總結(jié)

  • Vue.set () 的作用:解決 Vue 響應式系統(tǒng)無法檢測 “對象新增屬性”“數(shù)組索引修改” 等操作的問題,強制為數(shù)據(jù)添加響應式并觸發(fā)視圖更新。
  • 監(jiān)視數(shù)據(jù)的原理
    • Vue 2 基于 Object.defineProperty 劫持屬性的 getter/setter,實現(xiàn)依賴收集和更新通知。
    • Vue 3 基于 Proxy 代理整個對象,攔截所有操作,天然支持更多場景的監(jiān)測。

理解這一機制有助于避免 “數(shù)據(jù)修改后視圖不更新” 的常見問題,也能更深入地掌握 Vue 響應式系統(tǒng)的設計思想。

到此這篇關(guān)于Vue監(jiān)視數(shù)據(jù)的原理和set()使用方法的文章就介紹到這了,更多相關(guān)Vue監(jiān)視數(shù)據(jù)和set()使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue3封裝AES(CryptoJS)前端加密解密通信代碼實現(xiàn)

    vue3封裝AES(CryptoJS)前端加密解密通信代碼實現(xiàn)

    防止數(shù)據(jù)被爬取,前后端傳參接收參數(shù)需要加密處理,使用AES加密,這篇文章主要給大家介紹了關(guān)于vue3封裝AES(CryptoJS)前端加密解密通信代碼實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • 使用vue制作滑動標簽

    使用vue制作滑動標簽

    這篇文章主要為大家詳細介紹了使用vue制作滑動標簽,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • 如何利用vue.js實現(xiàn)拖放功能

    如何利用vue.js實現(xiàn)拖放功能

    這篇文章主要給大家介紹了如何利用vue.js實現(xiàn)拖放功能的相關(guān)資料,本文并未使用現(xiàn)有的庫,而是使用內(nèi)置的HTML拖放API來實現(xiàn)簡單的拖放系統(tǒng),需要的朋友可以參考下
    2021-06-06
  • Vue之Dep和Observer的用法及說明

    Vue之Dep和Observer的用法及說明

    這篇文章主要介紹了Vue之Dep和Observer的用法及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 關(guān)于ElementUI el-table 鼠標滾動失靈的問題及解決辦法

    關(guān)于ElementUI el-table 鼠標滾動失靈的問題及解決辦法

    這篇文章主要介紹了關(guān)于ElementUI el-table 鼠標滾動失靈的問題及解決辦法,本文給大家分享問題所在原因及解決方案,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • vue實現(xiàn)可移動的懸浮按鈕

    vue實現(xiàn)可移動的懸浮按鈕

    這篇文章主要為大家詳細介紹了vue實現(xiàn)可移動的懸浮按鈕,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 動態(tài)實現(xiàn)element ui的el-table某列數(shù)據(jù)不同樣式的示例

    動態(tài)實現(xiàn)element ui的el-table某列數(shù)據(jù)不同樣式的示例

    這篇文章主要介紹了動態(tài)實現(xiàn)element ui的el-table某列數(shù)據(jù)不同樣式的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • 解讀Vue-loader的相關(guān)知識

    解讀Vue-loader的相關(guān)知識

    這篇文章主要介紹了解讀Vue-loader的相關(guān)知識,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • vue實現(xiàn)購物車的監(jiān)聽

    vue實現(xiàn)購物車的監(jiān)聽

    這篇文章主要為大家詳細介紹了利用vue的監(jiān)聽事件實現(xiàn)一個簡單購物車,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • vuecli4中如何配置打包使用相對路徑

    vuecli4中如何配置打包使用相對路徑

    這篇文章主要介紹了vuecli4中如何配置打包使用相對路徑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評論

汕尾市| 上栗县| 南乐县| 翼城县| 瓦房店市| 石门县| 蒲江县| 镇原县| 武冈市| 同江市| 克拉玛依市| 绥芬河市| 滨州市| 万宁市| 集安市| 余庆县| 旺苍县| 福清市| 三江| 凤山市| 昌平区| 禄劝| 柞水县| 瑞昌市| 呼和浩特市| 彰武县| 扶绥县| 柳江县| 溧阳市| 社旗县| 吉隆县| 普兰店市| 颍上县| 阿拉善盟| 历史| 乌兰县| 松潘县| 密山市| 米易县| 德令哈市| 应城市|