淺談vuejs實(shí)現(xiàn)數(shù)據(jù)驅(qū)動視圖原理
什么是數(shù)據(jù)驅(qū)動
數(shù)據(jù)驅(qū)動是vuejs最大的特點(diǎn)。在vuejs中,所謂的數(shù)據(jù)驅(qū)動就是當(dāng)數(shù)據(jù)發(fā)生變化的時候,用戶界面發(fā)生相應(yīng)的變化,開發(fā)者不需要手動的去修改dom。
比如說我們點(diǎn)擊一個button,需要元素的文本進(jìn)行是和否的切換。在jquery刀耕火種的年代中,對于頁面的修改我們一般是這樣的一個流程,我們對button綁定事件,然后獲取文案對應(yīng)的元素dom對象,然后根據(jù)切換修改該dom對象的文案值。
而對于vuejs實(shí)現(xiàn)這個功能的流程,只需要在button元素上指明事件,同時聲明對應(yīng)文案的屬性,點(diǎn)擊事件的時候改變屬性的值,對應(yīng)元素的文本就能夠自動的進(jìn)行切換,我們不需要像以前那樣手動的操作dom。
簡而言之,就是vuejs幫我們封裝了數(shù)據(jù)和dom對象操作的映射,我們只需要關(guān)心數(shù)據(jù)的邏輯處理,數(shù)據(jù)的變化就能夠自然的通知頁面進(jìn)行頁面的重新渲染。
這樣做的確實(shí)給我們帶來的好處,我們不需要再在代碼中頻繁地去操作dom了,在實(shí)際項(xiàng)目中,我們有很大部分代碼都是在數(shù)據(jù)修改以后,手動操作重新渲染頁面元素,當(dāng)頁面越來越復(fù)雜的時候,頁面代碼組織會越來難以維護(hù)。同時,js對dom的頻繁操作,會使得頁面代碼的出錯概率高,頁面的視圖展示會融合在js代碼中,對于頁面視圖顯示的升級也不友好。
那么vuejs是如何實(shí)現(xiàn)這種數(shù)據(jù)驅(qū)動的呢?
MVVM框架
Vuejs的數(shù)據(jù)驅(qū)動是通過MVVM這種框架來實(shí)現(xiàn)的。MVVM框架主要包含3個部分:model、view和 viewmodel。
Model:指的是數(shù)據(jù)部分,對應(yīng)到前端就是javascript對象
View:指的是視圖部分,對應(yīng)前端就是dom
Viewmodel:就是連接視圖與數(shù)據(jù)的中間件
數(shù)據(jù)(Model)和視圖(View)是不能直接通訊的,而是需要通過ViewModel來實(shí)現(xiàn)雙方的通訊。當(dāng)數(shù)據(jù)變化的時候,viewModel能夠監(jiān)聽到這種變化,并及時的通知view做出修改。同樣的,當(dāng)頁面有事件觸發(fā)時,viewMOdel也能夠監(jiān)聽到事件,并通知model進(jìn)行響應(yīng)。Viewmodel就相當(dāng)于一個觀察者,監(jiān)控著雙方的動作,并及時通知對方進(jìn)行相應(yīng)的操作。
Vuejs的數(shù)據(jù)驅(qū)動實(shí)現(xiàn)
對于數(shù)據(jù)驅(qū)動的實(shí)現(xiàn),我們可以簡單的通過定時器來實(shí)現(xiàn)這個功能,定時器定時監(jiān)控對象數(shù)據(jù),定時器監(jiān)控數(shù)據(jù)變化,確定是否更新界面
a = 1; function renderDom(){ document.getElementById('app').innerHTML = '數(shù)據(jù)是' + a; } function watcher(method){ var b = a; method.apply(); return setInterval(function(){ if(b != a){ method.apply(); b = a; } }, 1000) } watcher(renderDom);
當(dāng)然vuejs不可能是這樣簡單暴力的實(shí)現(xiàn)方式,vuejs是通過在實(shí)現(xiàn)一個觀察者來實(shí)現(xiàn)的數(shù)據(jù)驅(qū)動。
首先,vuejs在實(shí)例化的過程中,會對遍歷傳給實(shí)例化對象選項(xiàng)中的data 選項(xiàng),遍歷其所有屬性并使用 Object.defineProperty把這些屬性全部轉(zhuǎn)為 getter/setter。
同時每一個實(shí)例對象都有一個watcher實(shí)例對象,他會在模板編譯的過程中,用getter去訪問data的屬性,watcher此時就會把用到的data屬性記為依賴,這樣就建立了視圖與數(shù)據(jù)之間的聯(lián)系。當(dāng)之后我們渲染視圖的數(shù)據(jù)依賴發(fā)生改變(即數(shù)據(jù)的setter被調(diào)用)的時候,watcher會對比前后兩個的數(shù)值是否發(fā)生變化,然后確定是否通知視圖進(jìn)行重新渲染。
這樣就實(shí)現(xiàn)了所謂的數(shù)據(jù)對于視圖的驅(qū)動。
關(guān)于代碼的實(shí)現(xiàn),可以參考一下這篇文章 實(shí)現(xiàn)vue2.0響應(yīng)式的基本思路
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于 Vue 實(shí)現(xiàn)一個酷炫的 menu插件
本文給大家介紹基于 Vue 實(shí)現(xiàn)一個酷炫的 menu插件,此篇教程需要大家具備一定的css和vue基礎(chǔ)知識,本文分步驟給大家介紹的非常詳細(xì),需要的朋友參考下吧2017-11-11VUEX 數(shù)據(jù)持久化,刷新后重新獲取的例子
今天小編就為大家分享一篇VUEX 數(shù)據(jù)持久化,刷新后重新獲取的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11require.js 加載 vue組件 r.js 合并壓縮的實(shí)例
這篇文章主要介紹了require.js 加載 vue組件 r.js 合并壓縮的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-10-10vue改變對象或數(shù)組時的刷新機(jī)制的方法總結(jié)
這篇文章主要介紹了vue改變對象或數(shù)組時的刷新機(jī)制的方法總結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04window.onresize在vue中只能使用一次,自適應(yīng)resize報錯問題
這篇文章主要介紹了window.onresize在vue中只能使用一次,自適應(yīng)resize報錯問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10在vue中實(shí)現(xiàn)PDF文件流預(yù)覽功能
這篇文章主要為大家詳細(xì)介紹如何在vue中實(shí)現(xiàn)PDF文件流預(yù)覽功能,文中的實(shí)現(xiàn)步驟講解詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考價值,需要的可以參考一下2023-12-12vue項(xiàng)目引入antDesignUI組件實(shí)現(xiàn)
本文介紹了如何以Vue引入antDesignUI,主要包括下載安裝、配置和引入組件等步驟,通過本文,讀者可以快速了解antDesignUI在Vue中的應(yīng)用,感興趣的可以了解一下2023-08-08Vue項(xiàng)目實(shí)現(xiàn)文件下載進(jìn)度條功能
大文件下載,花費(fèi)的時間比較長,沒有任何提示,用戶體驗(yàn)很差,需要優(yōu)化,提示文件在下載中,并且顯示進(jìn)度百分比,下面小編給大家?guī)砹薞ue項(xiàng)目實(shí)現(xiàn)文件下載進(jìn)度條功能,感興趣的朋友一起看看吧2024-03-03