Vue原始碼剖析(二)響應式

2021-09-29 02:27:07 字數 1565 閱讀 7250

主要是雙向繫結和依賴收集

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在原始碼...