主要是雙向繫結和依賴收集
object.defineproperty,vue.js就是基於它實現「響應式系統」的。
我們知道要實現雙向繫結需要給物件通過object.defineproperty新增getter和setter方法。那我們是怎麼來設定vue的呢,我們可以實現乙個observer函式,我們需要它接收乙個物件,那個物件是需要對資料進行響應式的,然後遍歷該物件的所有屬性設定object.defineproperty。
export default class dep
/*新增乙個觀察者物件*/
addsub (sub: watcher)
/*移除乙個觀察者物件*/
removesub (sub: watcher)
/*依賴收集,當存在dep.target的時候新增觀察者物件*/
depend ()
} /*通知所有訂閱者*/
notify ()
}}/*依賴收集完需要將dep.target設為null,防止後面重複新增依賴。*/
dep.target = null
class watcher
/* 更新檢視的方法 */
update ()
}dep.target = null;
// ps 注意這個target這個在原始碼裡面有特殊的應用。
通過上面兩個物件,我們可以看到訂閱者和觀察者,然後我們來定義乙個defineproperty
function definereactive (obj, key, val)
},set: function reactivesetter (newval)
});}
注意dep.depend()的條件,這是因為在第一次初始化的時候dep.target為null,所以不會進行依賴收集,一種是資料觀測階段執行了definereactive(),然後compile過程用到的資料會得以訪問,同時會觸發一次getter,然後加入依賴收集,另一種是computed(計算屬性)呼叫的時候會會生成乙個watcher,同時會觸發一次getter,然後加入依賴收集,整個vue專案裡面只有這兩種時候可以加入依賴收集。
watcher,在definereactive()之後,compile解析指令的時候,會去建立乙個watcher並繫結update方法,新增到dep物件上面。
然後之後我們就知道每一次修改物件狀態的時候,都會觸發setter方法,然後通過dep來通知加入依賴收集的watcher進行遍歷_update()修改,然後通過diff演算法 ,對比渲染到頁面。
// 劃重點,watcher是怎麼設定dep.target的,是通過生成watcher的時候,對全域性的dep物件加入了個target==_watcher,然後在dep.depend()的時候,把_watcher加入到閉包生成的dep陣列裡面。(這裡面有乙個dep,和乙個閉包dep)
Vue響應式原始碼分析
初始化資料initdata時呼叫obsreve函式。observe函式主要做了3件事 如果不是物件則啥都不做退出。物件已經是響應式的了,有 ob 了,直接返回這個依賴收集器。物件還不是響應式的,執行new observer observer中主要做了3件事 新建乙個new dep 依賴收集器,定義到...
Vue 響應式原理 原始碼
整個函式結束,相當於初始化所有屬性和vue內建事件 如 emit 並且使所有屬性變為響應式。初始化所有option api 對其中的使用者自定義資料data 進行 observe 此函式用來新建乙個類observer的例項,類observer的constructor中用walk 函式進行遍歷每個屬性...
vue原始碼剖析
基礎的資料 vue的核心是它的響應式系統,而響應式的核心是利用object.defineproperty進行資料攔截,這一屆內容會深入分析vue中兩種資料攔截的方式 object.defineproperty,proxy,object.defineproperty的相容性更好,但是proxy在原始碼...