今天講下vue的響應式資料,也就是mvvm雙向繫結模式,主要的目的是要讓大家了解該模式在vue中是如何實現的,所以將以極簡的**進行示例。
我們先假設這樣的乙個使用情景:
type="text" v-model="text">
}複製**
let vm=new vue(
});複製**
這裡就涉及到了vue的雙向繫結。
接下來我就用一些非常簡單**實現以上功能。
首先,我們得解析vue中的v-model
指令,也就是html中的自定義屬性,以及插入元件中的變數}
。這兩者都與響應式資料text
有關。
vue2.x後就使用了虛擬dom和diff演算法,但今天的目的是理解雙休繫結的原理,為了方便大家的理解,這裡使用vue1.x用過document fragment
來代替。document fragment
是乙個節點片段,對它的進行dom操作不會導致頁面的重排和重繪。它就是乙個優化dom操作的物件。具體的大家可以參考下mdn教程。
/**
* 節點轉換成節點片段,優化動態改變節點的效能
* @param root - vue的根節點
* @param vm - vue例項
*/function nodetoframge(root,vm)
return df;
}複製**
如何解析呢,一般就是遍歷dom節點了,然後判斷其中的節點型別,是元素節點就獲取其中的屬性節點,然後再進行遍歷,最後獲取到v-model
屬性,簡單示例:
/**
*編譯模板
* @param node - vue管理的節點
* @param vm - vue例項
*/複製**
function compile(node,vm) );
//刪除v-model自定義屬性
node.removeattribute('v-model');}}
}}複製**
而當遍歷到文字節點時:
//節點為文字型別
else
if(node.nodetype===3)\}/;
//找出響應式資料
if(reg.test(node.nodevalue))
}複製**
然後我們開始為每個插入dom的中資料實現乙個觀察者:
/**
* 觀察者
* @param vm
* @param node
* @param name
* @constructor
*/function watcher(vm,node,name)
//更新資料
watcher.prototype.update=function
() ;複製**
然後資料劫持,註冊觀察者。資料劫持主要用到了object.defineproperty方法,具體的同學可以看mdn的教程。
/**
* 資料劫持
* @param vm
*/function definereactive(vm) ,
get:function
() })
})}複製**
並為每個響應式的屬性實現乙個監聽者:
/**
* 監聽者
* @constructor
*/function
moniter
() //觸發觀察者
moniter.prototype.dispatch=function
() )
};//註冊觀察者
moniter.prototype.addwatcher=function (target) ; 複製**
vue的觀察者並不是乙個函式,而是乙個對像,如watcher物件。每個屬性都有乙個監聽者,就是儲存觀察者的陣列。觀察者和監聽者之間又個全域性標準,判斷是否要實現資料監聽。view到model方向的資料變化是js的事件監聽實現的,也算是內建的觀察者模式吧,在編譯模板的時候就已經實現觀察者的註冊,mode到view方向的資料變化是自定義的觀察者模式。在編譯模板中建立觀察者,在為資料建立訪問器屬性時建立堅監聽者,在get方法中註冊觀察者,在set方法中觸發***。
整體來說就是元素提取,模板編譯,事件監聽。
/**
* vue類
* @param options - 配置的資料
* @constructor
*/function vue(options) 複製**
可以直接執行得到示例**
參考:vue.js雙向繫結的實現原理(這篇文章寫得很好)
vue響應式原理解析
vue響應式原理解析 首先定義了四個核心的js檔案 1.observer.js 觀察者函式,用來設定data的get和set函式,並且把watcher存放在dep中 2.watcher.js 監聽者函式,用來設定dep.target開啟依賴收集的條件,和觸發檢視的更新函式 3.compile.js ...
Vue響應式原理深入解析
vue最明顯的特性之一便是響應式系統,其資料模型即是普通的 j ascript 物件。而當你讀取或寫入它們時,檢視便會進行響應操作。響應式data div id exp div const vm new vue vm.message this is b 響應式 vm.message this is ...
簡單理解vue響應式原理
通過object.defineproperty監聽物件屬性的改變 const obj object.keys obj foreach key get 發布訂閱者模式 當資料發生改變時呼叫的地方也跟著改變 發布者 class dep addsub wather notify 訂閱者 class wat...