網絡上有不少教你如何模仿vue手寫mvvm的視頻,我歷來沒有本身動手寫過。這週末想着必定要把這件事情完成。html
下面就關於vue如何實現two-way data-binding作一個簡單的步驟梳理,文字有點多,不過逐步看下去或許會對你們有所啓發哦,同時我也會把須要用到的知識點羅列出來~ vue
所謂雙向綁定,即數據變化 -> 視圖更新;視圖交互變化(如input) -> 數據model變動的效果。node
演示地址react
何爲mvvm?簡言之,把數據和視圖進行關聯的一種模式。這四個字母能夠這麼理解: Model, View, ViewModel。git
模仿vue來寫一個本身的mvvm,往簡單來說,通常涉及下面三個步驟:github
模板編譯 Compile數組
數據劫持 Observe網絡
所謂數據劫持就是當數據(必定是對象,引用類型的值)發生改變的時候,添加咱們本身的邏輯。通常狀況下,咱們給對象賦值都是直接let obj = value,完畢。在這個過程當中咱們沒法添加本身的邏輯,好比你但願當對象的值發生改變時(即監聽對象的變化,當發生改變時調用方法),例如給一個console輸出或作點別的,卻沒法作到。app
那麼如何添加本身的邏輯呢?答案就是ES5的Object.defineProperty方法。在調用Object.defineProperty方法時,若是不指定,configurable,enumerable和writable特性的默認值都是false,因此務必要把configurable和enumerable的值設置成true。最關鍵的是,給對像的某個key寫上get和set方法,這樣一來你就能夠在取值和賦值的過程當中添加本身的邏輯了。dom
監聽(數據)變化 Watcher
這是難點,也是關鍵點。
在Observe觀察到對象數據發生變化了,可是沒法改變視圖(view)。因此,watcher的做用,就是給各個綁定數據的地方,一一對應的進行監聽。在Observe發現數據變化後,調用watcher函數對相應的視圖進行數據更新。
未完待續~
ps.我的認爲單個功能的代碼不超過30行比較好。若是超過了,能夠拆分紅多個細小的代碼塊,方便閱讀,也方便梳理邏輯。