Vue的MVVM原理及其實現

2021-10-01 21:26:32 字數 1514 閱讀 7176

mvvm是model-view-viewmodel的簡寫。它本質上就是mvc 的改進版。

mvvm分為三個部分:分別是m(model,模型層 ),v(view,檢視層),vm(viewmodel,v與m連線的橋梁,也可以看作為控制器)

3、 vm:v與m溝通的橋梁,負責監聽m或者v的修改,是實現mvvm雙向繫結的要點

mvvm 就是將其中的view 的狀態和行為抽象化,讓我們將檢視 ui 和業務邏輯分開。

mvvm支援雙向繫結,意思就是當m層資料進行修改時,vm層會監測到變化,並且通知v層進行相應的修改,反之修改v層則會通知m層資料進行修改,以此也實現了檢視與模型層的相互解耦;

mvvm作為資料繫結的入口,整合observer、compile和watcher三者,通過observer來監聽自己的model資料變化,通過compile來解析編譯模板指令,最終利用watcher搭起observer和compile之間的通訊橋梁,達到資料變化 -> 檢視更新;檢視互動變化(input) -> 資料model變更的雙向繫結效果。

1.實現compile,進行模板的編譯,包括編譯元素(指令)、編譯文字等,達到初始化檢視的目的,並且還需要繫結好更新函式;

2.實現observe,監聽所有的資料,並對變化資料發布通知;

3.實現watcher,作為乙個中樞,接收到observe發來的通知,並執行compile中相應的更新方法。

4.結合上述方法,向外暴露mvvm方法。

function mvvm(options)

但是這裡有個問題,從**中可看出監聽的資料物件是options.data,每次需要更新檢視,則必須通過:

var vm = new mvvm(}); vm._data.name = 『dmq』;

這樣的方式來改變資料。

顯然不符合我們一開始的期望,我們所期望的呼叫方式應該是這樣的:

var vm = new mvvm(}); vm.name = 『dmq』;

所以這裡需要給mvvm例項新增乙個屬性**的方法,使訪問vm的屬性**為訪問vm._data的屬性,改造後的**如下:

function mvvm(options) );

observe(data, this);

this.$compile = new compile(options.el || document.body, this)

}mvvm.prototype = ,

set: function proxysetter(newval)

});}

};這裡主要還是利用了object.defineproperty()這個方法來劫持了vm例項物件的屬性的讀寫權,使讀寫vm例項的屬性轉成讀寫了vm._data的屬性值,達到效果.

跳表的原理及其實現

作用 目的 跳表作為一種資料結構通常用於取代平衡樹。起因平衡樹可以用於表示抽象的資料型別如字典和有序鍊錶,它通過樹旋轉 tree rotation 操作強制使樹結構保持平衡來保證節點搜尋的效率。在資料為隨機插入的情況下,平衡樹效能表現良好 但資料為順序插入或者需要刪除節點的情況下,平衡樹的效能就會有...

ARP原理及其實現方法

arp原理及其實現方法 在區域網中,是通過arp協議來完成ip位址轉換為第二層實體地址 即mac位址 的。arp協議對網路安全具有極其重要的意義。通過偽造ip位址和mac位址實現arp欺騙,能夠在網路中產生大量的arp通訊量使網路阻塞。arp協議是 address resolution protoc...

短址原理及其實現

url 演算法google 資料庫瀏覽器 伺服器 前言 最近看了一些關於短址 short url 方面的一些部落格,有些部落格說到一些好的東西,但是,也不是很全,所以,這篇部落格算是對其它部落格的乙個總結吧。介紹 短址,顧名思義,就是把長的 url 轉成短的 url,現在提供這種服務的有很多公司,我...