Vue面試題之vue實現MVVM數據綁定

MVVM

什麼是MVVM?

MVVM是Model-View-ViewModel,是把一個系統分爲了模型(model)、視圖(view)和view-model三個部分。vue是一個典型的MVVM思想,數據驅動視圖
通俗一點就是view層不直接和model層通信,他們只能通過view-model層通信。

vue中MVVM的理解

vue是一個MVVM漸進式框架,MVVM是vue的實際模式,在vue框架中數據會自動驅動視圖。我們寫vue就知道它的單文件組件開發方式。
Model:數據層,僅僅關注數據本身,不關心任何行爲。

對應vue組件中的data,props屬性。

View:視圖層,用戶操作頁面,當view-model對model更新的時候,會通過數據綁定更新到view。

對應vue組件中的template和style的部分。

ViewModel:業務邏輯層,view需要什麼數據,ViewModel就提供什麼數據,view有些哪些操作,ViewModel就要響應這些操作;View和ViewModel兩種交互方式:雙向數據傳遞(數據屬性和data binding)和單向傳遞操作(命令屬性);由於ViewModel的雙向數據綁定,當Model發生變化時,ViewModel就會更新,ViewModel變化,Model也會更新。

對應繼承Vue類的組件實例

vue在MVVM思想下,view和model沒有直接聯繫,但是view和view-model、model和view-model之間是會交互的。當view視圖進行dom操作等使數據發生變化時,可以通過view-model同步到model中,同樣的model數據變化也會同步到vue中。

MVVM的數據綁定實現

  • 發佈者-訂閱模式(backbone.js)
  • 髒值模式(angular/react)
  • 數據劫持(vue)

Vue實現MVVM的雙向綁定

vue數據劫持結合發佈者-訂閱者模式

vue是採用數據劫持結合發佈者-訂閱者模式的方式,通過Object.defineProperty()來劫持(監聽)各個屬性的settergetter,在數據(對象)發生變動時發佈消息給訂閱者,觸發相應的監聽回調。
因此,要實現MVVM的雙向綁定就必須要實現以下幾點:

  • 實現一個數據監聽器Observer。對數據對象的所有屬性進行監聽(包括子屬性對象的屬性),利用Object.defineProperty()對屬性都加上settergetter(這樣的話,給這個屬性的某個值賦值就會觸發 setter,那麼就能監聽數據的變化),如發生變動可拿到最新值並通知訂閱者。
  • 實現一個指令解析器Compile。對vue每個元素節點的指令進行掃描和解析,將指令模板的變量都替換成數據,然後初始化渲染頁面視圖,並將每個指令對應的節點綁定更新函數,添加監聽數據的訂閱者,一旦數據發生變動,收到通知,調用更新函數進行數據更新。
  • 實現一個訂閱者Watcher。Watcher是Observer和Compile之間通信的橋樑,主要任務是訂閱Observer中的屬性值變化的消息,當屬性值發生變化時,觸發指令解析器Compile中對應的更新函數,從而更新視圖。
  • 實現MVVM入口函數,整合以上三者。

Vue面試題之vue實現MVVM數據綁定

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章