Vue 雙向繫結的原理
Vue雙向繫結的原理
大致思路: 首先Vue會使用documentfragment劫持根元素裡包含的所有節點,這些節點不僅包括標籤元素,還包括文字,甚至換行的回車。
然後Vue會把data中所有的資料,用defindProperty()變成Vue的訪問器屬性,這樣每次修改這些資料的時候,就會觸發相應屬性的get,set方法。
接下來編譯處理劫持到的dom節點,遍歷所有節點,根據nodeType來判斷節點型別,根據節點本身的屬性(是否有v-model等屬性)或者文字節點的內容(是否符合{{文字插值}}的格式)來判斷節點是否需要編譯。對v-model,繫結事件當輸入的時候,改變Vue中的資料。對文字節點,將他作為一個觀察者watcher放入觀察者列表,當Vue資料改變的時候,會有一個主題物件,對列表中的觀察者們釋出改變的訊息,觀察者們再更新自己,改變節點中的顯示,從而達到雙向繫結的目的。
defineProperty()方法單獨定義。//訪問器屬性的"值"比較特殊,讀取或設定訪問器屬性的值,實際上是呼叫其內部特性:get和set函式。functiondefineReactive(obj,key,val){//這裡用到了觀察者(訂閱/釋出)模式,它定義了一種一對多的關係,讓多個觀察者監聽一個主題物件,這個主題物件的狀態發生改變時會通知所有觀察者物件,觀察者物件就可以更新自己的狀態。//例項化一個主題物件,物件中有空的觀察者列表var dep =new Dep();//將data的每一個屬性都設定為Vue物件的訪問器屬性,屬性名和data中相同//所以每次修改Vue.data的時候,都會呼叫下邊的get和set方法。然後會監聽v-model的input事件,當改變了input的值,就相應的改變Vue.data的資料,然後觸發這裡的set方法