Vue.js 和 MVVM 的小細節

來源:互聯網
上載者:User

標籤:好處   收集   變化   經典   訂閱   media   plm   rip   property   

Vue.js 和 MVVM 的小細節

轉載

流雲諸葛

連結:www.cnblogs.com/lyzg/p/6067766.html

 

MVVM 是Model-View-ViewModel 的縮寫,它是一種基於前端開發的架構模式,其核心是提供對View 和 ViewModel 的雙向資料繫結,這使得ViewModel 的狀態改變可以自動傳遞給 View,即所謂的資料雙向繫結

Vue.js 是一個提供了 MVVM 風格的雙向資料繫結的 Javascript 庫,專註於View 層。它的核心是 MVVM 中的 VM,也就是 ViewModel。 ViewModel負責串連 View 和 Model,保證視圖和資料的一致性,這種輕量級的架構讓前端開發更加高效、便捷。

為什麼會出現 MVVM 呢?

我接觸MVVM 是在2015年,可以說2015年是MVVM 最火熱的一年,而在這之前,我所知道的就是MVC,  MVC 大約是在5年前,也就是2011年的時候接觸的,那時候剛學程式設計語言,學的Java,而Java 中經典的 SSH 架構就用來構建一個標準的MVC 架構。說實話,MVC 用了這麼多年,但始終沒有很深刻的理解,只停留在用的層面, 一直到接觸 Vue.js 之後,研究了MVVM 架構思想,然後再回頭看 MVC ,才有一種豁然開朗的感覺~

MVC 即 Model-View-Controller 的縮寫,就是 模型-視圖-控制器 , 也就是說一個標準的Web 應用程式程式是由這三部分組成的:

 

View 用來把資料以某種方式呈現給使用者

Model 其實就是資料

Controller 接收並處理來自使用者的請求,並將 Model 返回給使用者

 

在HTML5 還未火起來的那些年,MVC 作為Web 應用程式的最佳實務是OK 的,這是因為 Web 應用程式的View 層相對來說比較簡單,前端所需要的資料在後端基本上都可以處理好,View 層主要是做一下展示,那時候提倡的是 Controller 來處理複雜的商務邏輯,所以View 層相對來說比較輕量,就是所謂的瘦用戶端思想。

2010年到2011年,HTML5概念被熱炒,受到追捧,2012年,W3C 正式宣布HTML5規範已經正式定稿。2013年我剛進公司就接觸了第一個 HTML5 架構Sench touch, 它是一款用來構建行動裝置 App的HTML5 架構,它將前後端徹底分離,前端採用MVC 架構,作為一個獨立的項目工程來維護。

為什麼前端要工程化,要是使用MVC? 

相對 HTML4 , HTML5 最大的亮點是它為行動裝置提供了一些非常有用的功能,使得 HTML5 具備了開發App的能力, HTML5開發App 最大的好處就是跨平台、快速迭代和上線,節省人力成本和提高效率,因此很多企業開始對傳統的App進行改造,逐漸用H5代替Native,到2015年的時候,市面上大多數App 或多或少嵌入都了H5 的頁面。

既然要用H5 來構建 App, 那View 層所做的事,就不僅僅是簡單的資料展示了,它不僅要管理複雜的資料狀態,還要處理行動裝置上各種操作行為等等。因此,前端也需要工程化,也需要一個類似於MVC 的架構來管理這些複雜的邏輯,使開發更加高效。 但這裡的 MVC 又稍微發了點變化:

View UI布局,展示資料

Model 管理資料

Controller 響應使用者操作,並將 Model 更新到 View 上

 

這種 MVC 架構模式對於簡單的應用來看起是OK 的,也符合軟體架構的分層思想。 但實際上,隨著H5 的不斷髮展,人們更希望使用H5 開發的應用能和Native 媲美,或者接近於原生App 的體驗效果,於是前端應用的複雜程度已不同往日,今非昔比。這時前端開發就暴露出了三個痛點問題:

1. 開發人員在代碼中大量調用相同的 DOM API, 處理繁瑣 ,操作冗餘,使得代碼難以維護。

2. 大量的DOM 操作使頁面渲染效能降低,載入速度變慢,影響使用者體驗。

3. 當 Model 頻繁發生變化,開發人員需要主動更新到View ;當使用者的操作導致 Model 發生變化,開發人員同樣需要將變化的資料同步到Model 中, 這樣的工作不僅繁瑣,而且很難維護複雜多變的資料狀態。

 

其實,早期jquery 的出現就是為了前端能更簡潔的操作DOM 而設計的,但它只解決了第一個問題,另外兩個問題始終伴隨著前端一直存在。

MVVM 的出現,完美解決了以上三個問題。

MVVM 由 Model,View,ViewModel 三部分構成,Model 層代表資料模型,也可以在Model中定義資料修改和操作的商務邏輯;View 代表UI 組件,它負責將資料模型轉化成UI 展現出來,ViewModel 是一個同步View 和 Model的對象。

在MVVM架構下,View 和 Model 之間並沒有直接的聯絡,而是通過ViewModel進行互動,Model 和 ViewModel 之間的互動是雙向的, 因此View 資料的變化會同步到Model中,而Model 資料的變化也會立即反應到View 上。

ViewModel 通過雙向資料繫結把 View 層和 Model 層串連了起來,而View 和 Model 之間的同步工作完全是自動的,無需人為幹涉,因此開發人員只需關注商務邏輯,不需要手動操作DOM, 不需要關注資料狀態的同步問題,複雜的資料狀態維護完全由 MVVM 來統一管理。

Vue.js 的細節

Vue.js 可以說是MVVM 架構的最佳實務,專註於 MVVM 中的 ViewModel,不僅做到了資料雙向繫結,而且也是一款相對來比較輕量級的JS 庫,API 簡潔,很容易上手。Vue的基礎知識網上有現成的教程,此處不再贅述, 下面簡單瞭解一下 Vue.js 關於雙向繫結的一些實現細節:

Vue.js 是採用 Object.defineProperty 的 getter 和 setter,並結合觀察者模式來實現資料繫結的。當把一個普通 Javascript 對象傳給 Vue 執行個體來作為它的 data 選項時,Vue 將遍曆它的屬性,用 Object.defineProperty 將它們轉為 getter/setter。使用者看不到 getter/setter,但是在內部它們讓 Vue 追蹤依賴,在屬性被訪問和修改時通知變化。

Observer 資料監聽器,能夠對資料對象的所有屬性進行監聽,如有變動可拿到最新值並通知訂閱者,內部採用Object.defineProperty的getter和setter來實現

Compile  指令解析器,它的作用對每個元素節點的指令進行掃描和解析,根據指令模板替換資料,以及綁定相應的更新函數

Watcher  訂閱者,   作為串連 Observer 和 Compile 的橋樑,能夠訂閱並收到每個屬性變動的通知,執行指令綁定的相應回呼函數

Dep      訊息訂閱器,內部維護了一個數組,用來收集訂閱者(Watcher),資料變動觸發notify 函數,再調用訂閱者的 update 方法

 

可以看出,當執行 new Vue() 時,Vue 就進入了初始化階段,一方面Vue 會遍曆 data 選項中的屬性,並用 Object.defineProperty 將它們轉為 getter/setter,實現資料變化監聽功能;另一方面,Vue 的指令編譯器Compile 對元素節點的指令進行掃描和解析,初始化視圖,並訂閱Watcher 來更新視圖, 此時Wather 會將自己添加到訊息訂閱器中(Dep),初始化完畢。

當資料發生變化時,Observer 中的 setter 方法被觸發,setter 會立即調用Dep.notify(),Dep 開始遍曆所有的訂閱者,並調用訂閱者的 update 方法,訂閱者收到通知後對視圖進行相應的更新。

以上內容是我在大半年的項目實踐之後,對MVVM 和 Vue.js 的一點點簡單認識和總結,希望對各位有所協助!

 

Vue.js 和 MVVM 的小細節

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.