說起這個mvvm模型,就不得不說mvc框架。
將整個前端頁面分成view,controller,modal,檢視上發生變化,通過controller(控制項)將響應傳入到model(資料來源),由資料來源改變view上面的資料。
整個過程看起來是行雲流水,業務邏輯放在model當中,頁面渲染邏輯放在view當中,但在實際運用上卻存在乙個問題:那就是mvc框架允許view和model直接進行通訊!!
換句話說,view和model之間隨著業務量的不斷龐大,會出現蜘蛛網一樣難以處理的依賴關係,完全背離了開發所應該遵循的「開放封閉原則」。
面對這個問題,mvvm框架就出現了,它與mvc框架的主要區別有兩點:
1、實現資料與檢視的分離
2、通過資料來驅動檢視,開發者只需要關心資料變化,dom操作被封裝了。
可以看到mvvm分別指view,model,view-model,view通過view-model的dom listeners將事件繫結到model上,而model則通過data bindings來管理view中的資料,view-model從中起到乙個連線橋的作用。
mvvm的實現主要是三個核心點:
響應式:vue如何監聽data的屬性變化
模板解析:vue的模板是如何被解析的
渲染:vue模板是如何被渲染成html的
對於mvvm來說,data一般是放在乙個物件當中,就比如這樣:
var obj =
當我們訪問或修改obj的屬性的時候,比如:
console.log(obj.name) //訪問
obj.age = 22 //修改
但是這樣的操作vue本身是沒有辦法感知到的,那麼應該如何讓vue知道我們進行了訪問或是修改的操作呢?
那就要使用object.defineproperty
var vm = {}
var data =
var key, value
for (key in data) ,
set: function (newval)
})})(key)
}
通過object.defineproperty將data裡的每乙個屬性的訪問與修改都變成了乙個函式,在函式get和set中我們即可監聽到data的屬性發生了改變。
首先模板是什麼?
模板本質上是一串字串,它看起來和html的格式很相像,實際上有很大的區別,因為模板本身還帶有邏輯運算,比如v-if,v-for等等,但它最後還是要轉換為html來顯示。
submitbutton>
div>
}li>
ul>
div>
div>
模板在vue中必須轉換為js**,原因在於:在前端環境下,只有js才是乙個圖靈完備語言,才能實現邏輯運算,以及渲染為html頁面。
這裡就引出了vue中乙個特別重要的函式——render
render函式中的核心就是with函式。
with函式將某個物件新增到作用域鏈的頂部,如果在 statement中有某個未使用命名空間的變數,跟作用域鏈中的某個屬性同名,則這個變數將指向這個屬性值。舉個例子:
var obj =
}function fn1()
}fn1()
with將obj這個物件放在了自己函式的作用域鏈的頂部,當執行下列函式時,就會自動到obj這個物件去尋找同名的屬性。
而在render函式中,with的用法是這樣:
submitbutton>
div>
}li>
ul>
div>
div>
// 對應的js檔案
var data =
// 初始化 vue 例項
var vm = new vue(}})
with(this),
[_c(
'div',
[_c(
'input',
],domprops:,
on:}}),
_v(" "),
_c('button',
},[_v("submit")])]
),_v(" "),
_c('div',
[_c(
'ul',
_l((list),function(item)))]
)])}
在一開始,因為new操作符,所以this指向了vm,通過with我們將vm這個物件放在作用域鏈的頂部,因為在函式內部我們會多次呼叫vm內部的屬性,所以使用with可以縮短變數長度,提供系統執行效率。
其中的_c函式表示的是建立乙個新的html元素,其基本用法為:
_c(element,,[children...])
其中的element表示所要建立的html元素型別,attrs表示所要建立的元素的屬性,children表示該html元素的子元素。
_v函式表示建立乙個文字節點,_l函式表示建立乙個陣列。
最終render函式返回的是乙個虛擬dom。
模板渲染為html分為兩種情況,第一種是初次渲染的時候,第二種是渲染之後資料發生改變的時候,它們都需要呼叫updatecomponent,其形式如下:
vm._update(vnode) else
}function updatecomponent()
首先讀取當前的虛擬dom——vm._vnode,判斷其是否為空,若為空,則為初次渲染,將虛擬dom全部渲染到所對應的容器當中(vm.$el),若不為空,則是資料發生了修改,通過響應式我們可以監聽到這一情況,使用diff演算法完成新舊對比並修改。 Vue 如何理解MVVM?
mvvm 即model view viewmodel的縮寫。背景 傳統元件,只是靜態渲染,通過拼接資料進行渲染,更新需要依賴於dom操作。而vue mvvm 資料驅動檢視。只需要更改資料,不需要自己操作dom,vue框架本身會根據資料重新渲染檢視。model 資料模型,進行資料的業務邏輯處理 vie...
MVVM模式理解
mvvm 是 model view viewmodel 的縮寫。model代表資料模型,也可以在model中定義資料修改和操作的業務邏輯。view代表ui 元件,它負責將資料模型轉化成ui 展現出來。viewmodel監聽模型資料的改變和控制檢視行為 處理使用者互動,簡單理解就是乙個同步view 和...
手寫 MVVM原理5
剛寫的原理,先放上來再說,後續補充解說 wather.js 觀察者的目的就是給需要變化的那個元素增加乙個觀察者,當資料變化後,執行對應的方法。vue的watch方法也是靠這個 用新值和老值進行比較,如果發生變化,就呼叫更新方法 vm.data expr class watcher getval ex...