Vue中的數(shù)據(jù)驅(qū)動(dòng)解釋
Vue中數(shù)據(jù)驅(qū)動(dòng)
使用過(guò)Vue框架的小伙伴知道在Vue中有這么一個(gè)玩意:v-model
。 這個(gè)玩意就用到了Vue中的數(shù)據(jù)驅(qū)動(dòng)(數(shù)據(jù)雙向綁定)。
那么,什么是數(shù)據(jù)驅(qū)動(dòng)呢?
數(shù)據(jù)驅(qū)動(dòng)解釋
數(shù)據(jù)驅(qū)動(dòng)是vue.js最大的特點(diǎn)。在vue.js中,所謂的數(shù)據(jù)驅(qū)動(dòng)就是當(dāng)數(shù)據(jù)發(fā)生變化的時(shí)候,用戶界面發(fā)生相應(yīng)的變化,開(kāi)發(fā)者不需要手動(dòng)的去修改dom。
再通俗一點(diǎn)就是,你在這里改變了一下數(shù)據(jù),在頁(yè)面其他使用該數(shù)據(jù)的地方也會(huì)隨之發(fā)生改變,而我們開(kāi)發(fā)者只是在這里改變了一下數(shù)據(jù),并沒(méi)有直接操作DOM
去改變其他地方的數(shù)據(jù)。
那Vue是怎么實(shí)現(xiàn)的這一效果呢?
Vue數(shù)據(jù)驅(qū)動(dòng)
其實(shí)這個(gè)原理有點(diǎn)像那個(gè)中間人,舉個(gè)例子吧,你的領(lǐng)導(dǎo)有一天改動(dòng)一條通知(數(shù)據(jù)發(fā)生了改變):今天不上班,然后被某個(gè)人聽(tīng)見(jiàn)了(監(jiān)聽(tīng)),這個(gè)人就把領(lǐng)導(dǎo)的消息傳遞給下面的程序員,下面的程序員一聽(tīng)到這個(gè)消息,馬上就準(zhǔn)備收拾東西回家休息了(頁(yè)面的元素隨之改變)。
大概就是下面這張圖:
那現(xiàn)在擺在我們面前的就有兩個(gè)問(wèn)題,這兩個(gè)箭頭是如何實(shí)現(xiàn)的呢?
首先我們看看數(shù)據(jù)驅(qū)動(dòng)是如何監(jiān)聽(tīng)數(shù)據(jù)發(fā)生變化的?
Vue 實(shí)例的數(shù)據(jù)對(duì)象。Vue 將會(huì)遞歸將 data 的屬性轉(zhuǎn)換為 getter/setter,從而讓 data 的屬性能夠響應(yīng)數(shù)據(jù)變化。對(duì)象必須是純粹的對(duì)象 (含有零個(gè)或多個(gè)的 key/value 對(duì)):瀏覽器 API 創(chuàng)建的原生對(duì)象,原型上的屬性會(huì)被忽略。大概來(lái)說(shuō),data 應(yīng)該只能是數(shù)據(jù) - 不推薦觀察擁有狀態(tài)行為的對(duì)象。
這是vue文檔里面的話,意思就是vue為data
里面的屬性(也就是我們的數(shù)據(jù)),都添加了getter/setter
。這樣就可以監(jiān)聽(tīng)到數(shù)據(jù)的變化了。是不是還有有點(diǎn)蒙?沒(méi)關(guān)系,其實(shí)就是利用defineProperty
方法來(lái)實(shí)現(xiàn)監(jiān)聽(tīng)的。
簡(jiǎn)單說(shuō)說(shuō)defineProperty
可能有小伙伴不太熟悉這個(gè)方法,我在這簡(jiǎn)單的提一下:
- 語(yǔ)法:
Object.defineProperty(obj,property,descriptor)
- 參數(shù):
obj
綁定屬性的目標(biāo)對(duì)象property
綁定的屬性名descriptor
屬性描述(配置項(xiàng))
下面我列出一些常見(jiàn)的屬性配置項(xiàng):
- value:設(shè)置屬性的默認(rèn)值
- writable:設(shè)置屬性是否可以被修改
- enumerable:設(shè)置屬性是否可以被遍歷
- configurable:設(shè)置屬性是否可以被編輯(包括刪除等等)
- get:獲取屬性值
- set:設(shè)置屬性值
其中set
與get
就是我們要用到的屬性:
舉個(gè)例子:
let data = { a:1; }; Object.defineProperty(data,a,{ get:()=>{ console.log('獲取數(shù)據(jù)啦'); }, set:(value)=>{ console.log('設(shè)置新數(shù)據(jù)啦',value); } })
通過(guò)這個(gè)方法就可以實(shí)現(xiàn)vue中數(shù)據(jù)驅(qū)動(dòng)對(duì)數(shù)據(jù)的監(jiān)聽(tīng),vue如何對(duì)視圖進(jìn)行更新呢?這就用到了vue中的虛擬DOM。我們下集聊聊這個(gè)Vue中的虛擬DOM。
以上就是Vue中的數(shù)據(jù)驅(qū)動(dòng)解釋的詳細(xì)內(nèi)容,更多關(guān)于Vue 數(shù)據(jù)驅(qū)動(dòng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue data對(duì)象重新賦值無(wú)效(未更改)的解決方式
這篇文章主要介紹了vue data對(duì)象重新賦值無(wú)效(未更改)的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07vue路由前進(jìn)后退動(dòng)畫效果的實(shí)現(xiàn)代碼
這篇文章主要介紹了vue路由前進(jìn)后退動(dòng)畫效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-12-12vue2中基于vue-simple-upload實(shí)現(xiàn)文件分片上傳組件功能
這篇文章主要介紹了vue2中基于vue-simple-upload的文件分片上傳組件,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06基于Vue CSR的微前端實(shí)現(xiàn)方案實(shí)踐
這篇文章主要介紹了基于Vue CSR的微前端實(shí)現(xiàn)方案實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05Vuejs對(duì)象常用操作之取對(duì)應(yīng)的值、取key和value值、轉(zhuǎn)數(shù)組及合并等
最近在學(xué)Vue和javascript感覺(jué)js的好多方法都不太清楚,這里徹底總結(jié)下,這篇文章主要給大家介紹了關(guān)于Vuejs對(duì)象常用操作之取對(duì)應(yīng)的值、取key和value值、轉(zhuǎn)數(shù)組及合并等的相關(guān)資料,需要的朋友可以參考下2024-01-01webpack+vue.js實(shí)現(xiàn)組件化詳解
vue的開(kāi)發(fā)體驗(yàn)還是比較愉悅的。首先文檔非常友好,所以上手會(huì)比較快。其次,配合webpack和vue-loader,每個(gè)頁(yè)面都是一個(gè).vue文件,寫起來(lái)很方便。所以很適合做組件化開(kāi)發(fā),這篇文章我們就來(lái)一起看看webpack+vue.js如何實(shí)現(xiàn)組件化。2016-10-10