淺談vue實現(xiàn)雙向事件綁定v-model的原理
與js或者jquery直接改變操作dom不同,vue使用v-model實現(xiàn)數(shù)據(jù)的雙向綁定,它會根據(jù)控件類型自動選取正確的方法來更新元素。
v-model就是vue的雙向綁定的指令,能將頁面上控件輸入的值同步更新到相關(guān)綁定的data屬性,也會在更新data綁定屬性時候,更新頁面上輸入控件的值
官方文檔這么解釋:
v-model只不過是一個語法糖而已,真正的實現(xiàn)靠的還是
v-bind:綁定響應(yīng)式數(shù)據(jù) 觸發(fā) input 事件 并傳遞數(shù)據(jù) (核心和重點(diǎn))如下代碼
<input v-model='txt'>
本質(zhì)上是
<input :value='txt' @input='txt = $event.target.value'>解釋:
初始化vue實例時候,會遞歸遍歷data的每一個屬性,并且通過defineProperty來監(jiān)聽每一個屬性的get,set方法,從而一旦某個屬性重新賦值,則能監(jiān)聽到變化來操作相應(yīng)的頁面控制
看下方代碼:
Object.defineProperty(data,'name',{get(){ return data['name'];},set(newVal){ let val=data['name']; if (val===newVal){return; } data['name']=newVal; // 監(jiān)聽到了屬性值的變化,假如node是其對應(yīng)的input節(jié)點(diǎn) node.value=newVal;}})總結(jié)
一方面modal層通過Object.defineProperty來劫持每個屬性,一旦監(jiān)聽到變化通過相關(guān)的頁面元素更新。另一方面通過編譯模板文件,為控件的v-model綁定input事件,從而頁面輸入能實時更新相關(guān)data屬性值
那么Object.defineProperty是用來控制一個對象屬性的一些特有操作,比如讀寫權(quán)、是否可以枚舉,這里我們主要先來研究下它對應(yīng)的兩個描述屬性get和set,v-model其實是對其get和set進(jìn)行重寫操作,get就是在讀取name屬性這個值觸發(fā)的函數(shù),set就是在設(shè)置name屬性這個值觸發(fā)的函數(shù)
補(bǔ)充v-model修飾符:.lazy、.trim和.number
lazy :在每次 input 事件觸發(fā)后將輸入框的值與數(shù)據(jù)進(jìn)行同步,添加 lazy 修飾符,從而轉(zhuǎn)變?yōu)槭褂?change 事件進(jìn)行同步
<input v-model.lazy='msg'>
trim :去除字符串首尾的空格
<input v-model.trim='msg'>
number :將數(shù)據(jù)轉(zhuǎn)化為值類型
<input v-model.number='msg'>
到此這篇關(guān)于淺談vue實現(xiàn)雙向事件綁定v-model的原理的文章就介紹到這了,更多相關(guān)vue 雙向事件綁定v-model內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. CSS3實例分享之多重背景的實現(xiàn)(Multiple backgrounds)2. 告別AJAX實現(xiàn)無刷新提交表單3. 使用純HTML的通用數(shù)據(jù)管理和服務(wù)4. CSS hack用法案例詳解5. 低版本IE正常運(yùn)行HTML5+CSS3網(wǎng)站的3種解決方案6. css進(jìn)階學(xué)習(xí) 選擇符7. HTML DOM setInterval和clearInterval方法案例詳解8. css代碼優(yōu)化的12個技巧9. 使用css實現(xiàn)全兼容tooltip提示框10. Vue+elementUI下拉框自定義顏色選擇器方式
