偵測資料的變化,當資料發生變化時,會通知檢視進行相應的更新操作
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 方法,當...