數據與視圖的綁定與同步,最終體現在對數據的讀寫處理過程中,也就是Object.defineProperty()定義的數據set、get函數中。Vue中對于的函數為defineReactive,在精簡版實現中,我只保留了一些基本特性:
functiondefineReactive(obj,key,value){
vardep=newDep()
Object.defineProperty(obj,key,{
enumerable:true,
configurable:true,
get:functionreactiveGetter(){
if(Dep.target){
dep.depend()
}
returnvalue
},
set:functionreactiveSetter(newVal){
if(value===newVal){
return
}else{
value=newVal
dep.notify()
}
}
})
}
在對數據進行讀取時,如果當前有Watcher(對數據的觀察者吧,watcher會負責將獲取的新數據發送給視圖),那將該Watcher綁定到當前的數據上(dep.depend(),dep關聯當前數據和所有的watcher的依賴關系),是一個檢查并記錄依賴的過程。而在對數據進行賦值時,如果數據發生改變,則通知所有的watcher(借助dep.notify())。這樣,即便是我們手動改變了數據,框架也能夠自動將數據同步到視圖。