vue充分利用了object.defineproperty()
方法,通過發布訂閱模式,在對data
屬性的讀寫操作,轉換成get/set
方法,當資料變化時通知檢視更新。
定義:object.defineproperty()
是直接在物件上定義乙個新屬性或者可以直接修改乙個現有屬性,並返回該物件。
let demo=
object.
defineproperty
(demo,
"test",,
set(newvalue)})
demo.test //test屬性被讀取 "newtest"
demo.test=
"test123"
//test屬性被重置為test123 "test123"
通過上面例子可以發現,demo物件訪問test屬性時候,會先訪問object.defineproperty()中get方法,修改時會訪問set方法。
這樣我們就可以觀察到物件中屬性讀寫的變化。
如果我們想對demo中的所有屬性進行監測,需要對屬性進行遍歷,然後觀察:
//遍歷物件屬性,觀察值變化
function
observable
(obj)
}//單個屬性監測
function
definereactive
(obj,key)
屬性被讀取了`);
return obj[key];}
,set
(newval)
屬性被修改了`);
val = newval;}}
)}
在資料被讀或寫的時候通知那些依賴該資料的檢視更新了,為了方便,我們需要先將所有依賴收集起來,一旦資料發生變化,就統一通知更新。其實,這就是典型的「發布訂閱者」模式,資料變化為「發布者」,依賴物件為「訂閱者」。
建立訊息訂閱:
class
dep,
//增加訂閱者
addsub
(sub)
,//判斷是否增加訂閱者
depend()
},//通知訂閱者更新
notify()
)}}dep.target =
null
;
將訂閱方法,增加至definereative
方法中:
function
definereactive
(obj,key,val)
屬性被讀取了`);
return val;},
set(newval)
屬性被修改了`);
dep.
notify()
//資料變化通知所有訂閱者}}
vue 原始碼之雙向繫結
vue 雙向繫結,問就是 object.defineproperty 劫持資料獲得狀態變更,發布訂閱者模式進行變更通知。好吧,現在地球人都知道這兩句話了,要是別人再問你實現細節,我們應該如何回答呢。也是為了讓自己更加了解,從自己大概知道和能與人清楚表達,這就是今天寫文章的目的了。閱讀前,你需要具備 ...
Vue雙向繫結
把乙個普通物件 a 傳給 vue 例項作為它的 data 選項,vue.js 將遍歷它的屬性,用object.defineproperty 將它們轉為 getter setter,如圖綠色的部分所示。每次使用者更改data裡的資料的時候,比如a.b 1,setter就會重新通知watcher進行變動...
Vue 雙向繫結
在react或者vue這類mvvm框架中使用雙向繫結是很常見的需求,最近專案中在使用vue,今天來談一談vue中雙向繫結的實現。先來說幾句廢話 什麼是雙向繫結?把model中的資料繫結到view中,然後更新model時view會自動跟新,這叫單向繫結,而當使用者改變view時model中資料也能自動...