Vue響應式原理總結

2021-10-07 23:25:33 字數 1383 閱讀 6970

偵測資料的變化,當資料發生變化時,會通知檢視進行相應的更新操作

vue實現變化政策的方案是:資料劫持+發布訂閱模式

如何追蹤變化?

答:object.defineproperty()

object.defineproperty()對data中的各個屬性進行getter和setter的定義

所以在vue當中,getter收集依賴,setter觸發依賴

收集的依賴在哪?

答:放在dep中,dep可以理解為排程中心

dep是乙個封裝好的類,用於集中收集依賴,在dep中維護了乙個名為subs的陣列用於儲存訂閱者

依賴是誰?

答:元件例項,即watcher

vue2.0開始,將粒度調整為中粒度,即乙個狀態所繫結的依賴不再是具體的dom節點,而是乙個元件

watcher是乙個中介角色,資料發生變化時通知它,然後它再通知其他地方

在vue2.0中,元件和watcher是一一對應的

data中的資料如何變成響應式的?

答:通過walk()+definereactive()

vue中封裝了乙個observer類,這個類的作用是將乙個資料內的所有屬性(包括子屬性)都轉換成getter/setter的形式

具體實現:通過walker遍歷物件的屬性,呼叫definereactive將每乙個屬性變成getter/setter;如果該屬性還是乙個物件,則遞迴該屬性

關於object的問題

對於物件新增的屬性,vue無法偵測,需要使用vm.$set

對於物件屬性被刪除,vue無法偵測,需要呼叫vm.$delete

所以:getter/setter只能追蹤乙個資料是否被修改,無法追蹤新增屬性和刪除屬性

引言:object的變化偵測是靠getter和setter來實現的,但是如果是陣列則不一樣

***我們通過array原型物件中提供的方法來對陣列自身內容改變,vue是偵測不到的,所以我們需要對這些方法進行攔截/重寫

這些方法包括:push/pop/unshift/shift/splice/sort/reverse

所以我們通過***去覆蓋陣列原型的上述方法來追蹤變化

對於陣列,收集依賴仍然是通過getter,在***中觸發依賴

注意:依賴儲存的位置必須在getter和***中都可以訪問到

關於array的問題

使用陣列索引來更新陣列,vue無法偵測,需要呼叫set

對陣列length的修改(比如length=0清空陣列),vue偵測不到,可以使用splice

vue響應式布局 Vue 響應式原理

vue2 的資料偵測 在 src observer 目錄裡面,元件例項在初始化時,會呼叫 observe 函式處理 data function initdata vm observe 改寫了所有物件屬性的 getter setter 和陣列原型上的 7 個會改寫陣列方法,從而讓 data 變成可響應...

vue響應式原理

響應式系統是vue框架核心的部分,資料物件僅僅是普通的 js物件。當我們改變資料時,檢視也會被改變,本文就來 一下vue 的響應式原理。vue響應式的核心是使用了es5 新增的api object.defineproperty 因此vue不支援ie8 object.defineproperty的作用...

vue響應式原理

要了解響應式原理首先應該知道什麼是響應式 更改 vue的響應式原理是什麼 vue資料的雙向繫結是通過資料劫持結合發布訂閱模式,偵測到資料變化,然後通過object.defineproperty 物件對每個屬性的getter和setter進行劫持。當讀取 data 中的資料時自動呼叫 get 方法,當...