淺談vue實(shí)現(xiàn)雙向事件綁定v-model的原理
與js或者jquery直接改變操作dom不同,vue使用v-model實(shí)現(xiàn)數(shù)據(jù)的雙向綁定,它會(huì)根據(jù)控件類型自動(dòng)選取正確的方法來(lái)更新元素。
v-model就是vue的雙向綁定的指令,能將頁(yè)面上控件輸入的值同步更新到相關(guān)綁定的data屬性,也會(huì)在更新data綁定屬性時(shí)候,更新頁(yè)面上輸入控件的值
官方文檔這么解釋:
v-model只不過(guò)是一個(gè)語(yǔ)法糖而已,真正的實(shí)現(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實(shí)例時(shí)候,會(huì)遞歸遍歷data的每一個(gè)屬性,并且通過(guò)defineProperty來(lái)監(jiān)聽(tīng)每一個(gè)屬性的get,set方法,從而一旦某個(gè)屬性重新賦值,則能監(jiān)聽(tīng)到變化來(lái)操作相應(yīng)的頁(yè)面控制
看下方代碼:
Object.defineProperty(data,"name",{ get(){ return data["name"]; }, set(newVal){ let val=data["name"]; if (val===newVal){ return; } data["name"]=newVal; // 監(jiān)聽(tīng)到了屬性值的變化,假如node是其對(duì)應(yīng)的input節(jié)點(diǎn) node.value=newVal; } })
總結(jié)
一方面modal層通過(guò)Object.defineProperty來(lái)劫持每個(gè)屬性,一旦監(jiān)聽(tīng)到變化通過(guò)相關(guān)的頁(yè)面元素更新。另一方面通過(guò)編譯模板文件,為控件的v-model綁定input事件,從而頁(yè)面輸入能實(shí)時(shí)更新相關(guān)data屬性值
那么Object.defineProperty是用來(lái)控制一個(gè)對(duì)象屬性的一些特有操作,比如讀寫(xiě)權(quán)、是否可以枚舉,這里我們主要先來(lái)研究下它對(duì)應(yīng)的兩個(gè)描述屬性get和set,v-model其實(shí)是對(duì)其get和set進(jìn)行重寫(xiě)操作,get就是在讀取name屬性這個(gè)值觸發(fā)的函數(shù),set就是在設(shè)置name屬性這個(gè)值觸發(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實(shí)現(xiàn)雙向事件綁定v-model的原理的文章就介紹到這了,更多相關(guān)vue 雙向事件綁定v-model內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue3自定義組件之v-model實(shí)現(xiàn)父子組件雙向綁定
- vue中v-model和響應(yīng)式的實(shí)現(xiàn)原理解析
- vue自定義組件實(shí)現(xiàn)v-model雙向綁定數(shù)據(jù)的實(shí)例代碼
- vue使用v-model進(jìn)行跨組件綁定的基本實(shí)現(xiàn)方法
- vue.js使用v-model實(shí)現(xiàn)父子組件間的雙向通信示例
- vue.js自定義組件實(shí)現(xiàn)v-model雙向數(shù)據(jù)綁定的示例代碼
- vue3實(shí)現(xiàn)v-model原理詳解
- Vue v-model實(shí)現(xiàn)案例介紹
相關(guān)文章
vue實(shí)現(xiàn)下拉框篩選表格數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)下拉框篩選表格數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09Vue實(shí)現(xiàn)Base64轉(zhuǎn)png、jpg圖片格式
這篇文章主要給大家介紹了關(guān)于Vue實(shí)現(xiàn)Base64轉(zhuǎn)png、jpg圖片格式的相關(guān)資料,前段獲取生成的是base64圖片,需要轉(zhuǎn)化為jpg,png,需要的朋友可以參考下2023-09-09vue3使用useMouseInElement實(shí)現(xiàn)圖片局部放大預(yù)覽效果實(shí)例代碼
現(xiàn)在很多的項(xiàng)目里面圖片展示縮略圖,然后點(diǎn)擊實(shí)現(xiàn)圖片預(yù)覽,放大的功能,下面這篇文章主要給大家介紹了關(guān)于vue3使用useMouseInElement實(shí)現(xiàn)圖片局部放大預(yù)覽效果的相關(guān)資料,需要的朋友可以參考下2023-03-03VUE?項(xiàng)目如何使用?Docker+Nginx進(jìn)行打包部署
使用?Docker,你可以創(chuàng)建一個(gè)包含?Vue.js?應(yīng)用程序的容器鏡像,并在任何支持?Docker?的環(huán)境中運(yùn)行該鏡像,這篇文章主要介紹了VUE?項(xiàng)目用?Docker+Nginx進(jìn)行打包部署,需要的朋友可以參考下2024-06-06vue跳轉(zhuǎn)到詳情頁(yè)的兩種實(shí)現(xiàn)方法
最近接觸了vue項(xiàng)目,下面這篇文章主要給大家介紹了關(guān)于vue跳轉(zhuǎn)到詳情頁(yè)的兩種實(shí)現(xiàn)方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-06-06vue 實(shí)現(xiàn)setInterval 創(chuàng)建和銷毀實(shí)例
這篇文章主要介紹了vue 實(shí)現(xiàn)setInterval 創(chuàng)建和銷毀實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07腳手架vue-cli工程webpack的作用和特點(diǎn)
webpack是一個(gè)模塊打包的工具,它的作用是把互相依賴的模塊處理成靜態(tài)資源。這篇文章主要介紹了vue-cli工程webpack的作用和特點(diǎn),需要的朋友可以參考下2018-09-09