MVVM(Model-View-ViewModel)是一種設計模式,是在MVC(Model-View-Controller)的基礎上演化而來的,旨在通過數據綁定來實現View和Model之間的雙向綁定,同時ViewModel作為View和Model之間的數據傳輸層,負責將View的操作轉化成對Model的操作,將Model的數據轉化成View可以顯示的數據。
var data = { message: "Hello, Vue!", username: "Guest" }; var vm = new Vue({ el: "#app", data: data, computed: { greeting: function() { return `Welcome, ${this.username}! ${this.message} `; } }, methods: { changeMessage: function() { this.message = "Nice to meet you!"; } } });
Vue采用了MVVM模式,并加以改進,將ViewModel進一步細分為Observer、Compiler和Watcher。Observer將Model數據轉化成帶有數據劫持功能的Observer對象,Compiler將模板和Observer進行合成,生成可以渲染的View,Watcher監聽數據變化,并將變化反映到View的相關節點上。
var data = { message: "Hello, Vue!" }; function Observer(data) { this.data = data; this.walk(data); } Observer.prototype = { walk: function(obj) { var val; for (var key in obj) { if (obj.hasOwnProperty(key)) { val = obj[key]; if (typeof val === "object") { new Observer(val); } this.convert(key, val); } } }, convert: function(key, val) { Object.defineProperty(this.data, key, { configurable: true, enumerable: true, get: function() { console.log("你訪問了 " + key); return val; }, set: function(newVal) { console.log("你設置了 " + key + ",新的值為 " + newVal); if (newVal === val) return; val = newVal; } }); } };
Vue的數據綁定機制采用了雙向數據綁定和單向數據綁定兩種方式。雙向數據綁定指的是數據的變化可以自動反映到View上,View的變化也可以自動反映到數據上;單向數據綁定指的是數據的變化只能自動反映到View上或者View的變化只能自動反映到數據上。
var vm = new Vue({ el: "#app", data: { message: "Hello, Vue!" } });{{message}}
Vue的數據綁定機制將MVVM模式完美地實現,它使得View和Model之間的數據同步變得非常方便,同時也降低了開發者的心智負擔,讓開發者更專注于業務邏輯的實現。