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

Vue數(shù)據(jù)響應式原理步驟解析

 更新時間:2025年06月10日 10:36:54   作者:teeeeeeemo  
Vue的數(shù)據(jù)響應式原理是其核心特性之一,它實現(xiàn)了數(shù)據(jù)變化自動驅(qū)動視圖更新,下面給大家分別詳解Vue?2.x和Vue?3.x的實現(xiàn)方式,感興趣的朋友一起看看吧

Vue 的數(shù)據(jù)響應式原理是其核心特性之一,它實現(xiàn)了數(shù)據(jù)變化自動驅(qū)動視圖更新。Vue 2.x 和 Vue 3.x 的實現(xiàn)方式不同,下面分別詳解:

Vue 2.x 的響應式原理(基于 Object.defineProperty)

核心步驟:

數(shù)據(jù)劫持(Observer):
-遍歷 data 中的每個屬性,用 Object.defineProperty 重寫其 getter/setter。
-每個屬性關(guān)聯(lián)一個 Dep 實例(依賴收集器)。依賴收集(Dependency Collection):
-當組件渲染時,會訪問數(shù)據(jù)屬性,觸發(fā) getter。
-此時 Dep 會記錄當前 Watcher(每個組件對應一個渲染 Watcher)。派發(fā)更新(Dispatching Updates):
-當數(shù)據(jù)被修改時,觸發(fā) setter。
-Dep 通知所有關(guān)聯(lián)的 Watcher 執(zhí)行更新(如重新渲染組件)。數(shù)組的特殊處理:
-重寫數(shù)組的 7 個方法(push/pop/shift/unshift/splice/sort/reverse),在調(diào)用這些方法時手動觸發(fā)更新。
-通過 proto 繼承改寫后的數(shù)組方法(或直接覆蓋原型)。

代碼簡化示例:

class Dep {
  constructor() {
    this.subs = new Set();
  }
  depend() {
    if (currentWatcher) this.subs.add(currentWatcher);
  }
  notify() {
    this.subs.forEach(watcher => watcher.update());
  }
}
function defineReactive(obj, key) {
  const dep = new Dep();
  let value = obj[key];
  Object.defineProperty(obj, key, {
    get() {
      dep.depend(); // 收集依賴
      return value;
    },
    set(newVal) {
      value = newVal;
      dep.notify(); // 觸發(fā)更新
    }
  });
}

局限性:

  • 無法檢測新增/刪除屬性 → 需用 Vue.set/Vue.delete。
  • 數(shù)組索引/長度修改無法監(jiān)聽 → 需用重寫的方法或 Vue.set。
  • 遞歸遍歷對象性能損耗。

Vue 3.x 的響應式原理(基于 Proxy)

Vue 3 使用 Proxy 替代 Object.defineProperty,徹底解決 Vue 2 的痛點。

核心步驟:

代理對象(Reactive):
-通過 Proxy 包裹目標對象,攔截 所有操作(增/刪/改/查/遍歷等)。
-每個對象關(guān)聯(lián)一個 ReactiveEffect 集合。

依賴收集:
-當訪問數(shù)據(jù)時,觸發(fā) get 攔截,收集當前活躍的 Effect(副作用函數(shù))。

觸發(fā)更新:
-當修改數(shù)據(jù)時,觸發(fā) set 或 deleteProperty 攔截,通知所有關(guān)聯(lián)的 Effect 重新執(zhí)行。

代碼簡化示例:

const targetMap = new WeakMap(); // 存儲所有依賴
function track(target, key) {
  if (!activeEffect) return;
  let depsMap = targetMap.get(target);
  if (!depsMap) targetMap.set(target, (depsMap = new Map()));
  let dep = depsMap.get(key);
  if (!dep) depsMap.set(key, (dep = new Set()));
  dep.add(activeEffect); // 收集當前 Effect
}
function trigger(target, key) {
  const depsMap = targetMap.get(target);
  if (!depsMap) return;
  depsMap.get(key)?.forEach(effect => effect.run()); // 執(zhí)行所有 Effect
}
const proxy = new Proxy(data, {
  get(target, key) {
    track(target, key); // 訪問時收集依賴
    return Reflect.get(target, key);
  },
  set(target, key, value) {
    Reflect.set(target, key, value);
    trigger(target, key); // 修改時觸發(fā)更新
    return true;
  }
});

優(yōu)勢:

  • 支持監(jiān)聽動態(tài)新增/刪除屬性。
  • 支持監(jiān)聽數(shù)組索引和長度變化
  • 惰性收集:僅代理訪問到的屬性,減少初始化開銷。
  • 統(tǒng)一處理對象/數(shù)組,無需特殊邏輯。

關(guān)鍵概念補充

副作用函數(shù)(Effect):
-Vue 3 使用 ReactiveEffect 封裝更新邏輯(相當于 Vue 2 的 Watcher)。
-組件渲染、計算屬性、偵聽器都是副作用函數(shù)。

響應式 API:
-reactive():創(chuàng)建深層次響應式對象(基于 Proxy)。
-ref():將基本類型包裝為 { value: … } 的響應式引用(通過 .value 訪問)。
-computed/watch:基于 Effect 系統(tǒng)實現(xiàn)。

依賴清理:
-每次執(zhí)行 Effect 前清理舊依賴,避免無效更新(如條件分支變化時)。

總結(jié)對比

特性Vue 2(Object.defineProperty)Vue 3(Proxy)
對象監(jiān)聽遞歸遍歷屬性直接代理整個對象
新增/刪除屬性不支持(需 Vue.set)支持
數(shù)組監(jiān)聽需重寫方法直接支持索引修改
性能初始化遞歸消耗大按需代理,內(nèi)存更優(yōu)
兼容性支持 IE9+不支持 IE(需 Polyfill)

Vue 3 的響應式系統(tǒng)獨立為庫 @vue/reactivity,可脫離框架使用。

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

相關(guān)文章

  • 解決Vue項目打包后打開index.html頁面顯示空白以及圖片路徑錯誤的問題

    解決Vue項目打包后打開index.html頁面顯示空白以及圖片路徑錯誤的問題

    這篇文章主要介紹了解決Vue項目打包后打開index.html頁面顯示空白以及圖片路徑錯誤的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Vue頁面骨架屏的實現(xiàn)方法

    Vue頁面骨架屏的實現(xiàn)方法

    在開發(fā)webapp的時候總是會受到首屏加載時間過長的影響,越來越多的APP采用了“骨架屏”的方式去提升用戶體驗。這篇文章主要介紹了Vue頁面骨架屏的實現(xiàn)方法,感興趣的小伙伴們可以參考一下
    2018-05-05
  • vue微信分享出來的鏈接點開是首頁問題的解決方法

    vue微信分享出來的鏈接點開是首頁問題的解決方法

    這篇文章主要為大家詳細介紹了vue微信分享出來的鏈接點開是首頁問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Vue2使用vue-video-player實現(xiàn)斷點續(xù)傳功能

    Vue2使用vue-video-player實現(xiàn)斷點續(xù)傳功能

    斷點續(xù)傳是指在文件傳輸過程中,如果傳輸被中斷或者發(fā)生錯誤,可以從上一次中斷的地方繼續(xù)傳輸,而不是從頭開始,這對于大文件的傳輸尤為重要,本文給大家介紹了Vue2使用vue-video-player實現(xiàn)斷點續(xù)傳功能,需要的朋友可以參考下
    2025-07-07
  • vue created鉤子函數(shù)與mounted鉤子函數(shù)的用法區(qū)別

    vue created鉤子函數(shù)與mounted鉤子函數(shù)的用法區(qū)別

    這篇文章主要介紹了vue created鉤子函數(shù)與mounted鉤子函數(shù)的用法區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • VUE?mixin?使用示例詳解

    VUE?mixin?使用示例詳解

    混入mixin提供了一種非常靈活的方式,來分發(fā)Vue組件中的可復用功能,一個混入對象可以包含任意組件選項,接下來通過本文給大家介紹VUE?mixin?使用,需要的朋友可以參考下
    2022-08-08
  • vue+elementUI(el-upload)圖片壓縮,默認同比例壓縮操作

    vue+elementUI(el-upload)圖片壓縮,默認同比例壓縮操作

    這篇文章主要介紹了vue+elementUI(el-upload)圖片壓縮,默認同比例壓縮操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Vue表單提交點擊事件只允許點擊一次的實例

    Vue表單提交點擊事件只允許點擊一次的實例

    這篇文章主要介紹了Vue表單提交點擊事件只允許點擊一次的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Vue.js原理分析之observer模塊詳解

    Vue.js原理分析之observer模塊詳解

    這篇文章主要介紹了Vue.js中observer模塊的相關(guān)資料,文中通過原理分析介紹還是相對的詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-02-02
  • vue封裝自定義分頁器組件與使用方法分享

    vue封裝自定義分頁器組件與使用方法分享

    這篇文章主要給大家介紹了關(guān)于vue封裝自定義分頁器組件與使用方法的相關(guān)資料,非常的好用,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-01-01

最新評論

河源市| 秭归县| 泰来县| 星子县| 策勒县| 康平县| 高淳县| 黎川县| 英德市| 铜梁县| 沭阳县| 嵊泗县| 德安县| 霍林郭勒市| 雷州市| 修武县| 于都县| 兴隆县| 申扎县| 贞丰县| 桐乡市| 丰宁| 越西县| 洛阳市| 安福县| 阜康市| 吴忠市| 孙吴县| 水城县| 肃宁县| 临沂市| 临沧市| 伊春市| 洪湖市| 岐山县| 潞城市| 项城市| 丽江市| 图木舒克市| 宝兴县| 丘北县|