vue項(xiàng)目中v-model父子組件通信的實(shí)現(xiàn)詳解
前言
我們?cè)趘ue項(xiàng)目中,經(jīng)常有這樣的需求,父組件綁定v-model,子組件輸入更改父組件v-model綁定的數(shù)值。很多朋友對(duì)這種操作不是很清楚,這需要對(duì)v-model有比較深入的了解,今天談?wù)剉-model。
vue的雙向數(shù)據(jù)綁定
v-model這個(gè)指令只能用在<input>, <select>,<textarea>這些表單元素上,所謂雙向綁定,指的就是我們?cè)趈s中的vue實(shí)例中的data與其渲染的dom元素上的內(nèi)容保持一致,兩者無論誰被改變,另一方也會(huì)相應(yīng)的更新為相同的數(shù)據(jù)。
這個(gè)問題在很多前端面試中,會(huì)提及。面試官問你,vue的雙向數(shù)據(jù)綁定原理是什么?當(dāng)然,這個(gè)也是耳熟能詳?shù)膯栴},百度隨便一搜索,到處都能找到答案。
一般都會(huì)搜索到,是用Object.defineProperty( ) ,來監(jiān)聽數(shù)據(jù)get和set,來實(shí)現(xiàn)數(shù)據(jù)劫持的。
假如對(duì)Object.defineProperty( )不是很了解,可以點(diǎn)擊上面鏈接,看看其語法!
舉個(gè)簡(jiǎn)單的例子:
var blog = {
name: 'haorooms博客'
};
console.log(blog.name); // haorooms博客
如果想要在執(zhí)行console.log(blog.name)的同時(shí),直接給haorooms博客加個(gè)書名號(hào),那要怎么處理呢?或者說要通過什么監(jiān)聽對(duì)象 blog的屬性值。這時(shí)候Object.defineProperty( )就派上用場(chǎng)了,代碼如下:
var blog= {}
var name = '';
Object.defineProperty(blog, 'name', {
set: function (value) {
name = value;
console.log('歡迎來到' + value);
},
get: function () {
return '《' + name + '》'
}
})
blog.name = 'haorooms博客'; // 歡迎來到haorooms博客
console.log(blog.name); // 《haorooms博客》
上面代碼執(zhí)行一下,可以查看效果!
關(guān)于 vue的雙向數(shù)據(jù)綁定,具體如何實(shí)現(xiàn)的?網(wǎng)上也有很多實(shí)現(xiàn)的代碼,這里就不多累贅了!
v-model 的使用
上面開了一個(gè)小差,講了那么多,其實(shí)就是為了說明Vue 是單項(xiàng)數(shù)據(jù)流,v-model 只是語法糖而已。
<input v-model="haorooms" /> <input v-bind:value="haorooms" v-on:input="haorooms= $event.target.value" />
第一行的代碼其實(shí)只是第二行的語法糖。然后第二行代碼還能簡(jiǎn)寫成這樣:
<input :value="haorooms" @input="haorooms= $event.target.value" />
也就是說,
<input v-model="haorooms" />
也可以寫成
<input :value="haorooms" @input="haorooms= $event.target.value" />
v-model在組件上的使用
回到我們一開始的疑問了?vue中v-model如何進(jìn)行父子組件的通信?如何在組件中使用呢?假如你理解了我上面的例子,那么,我們就可以很簡(jiǎn)單的在組件中使用v-model了。
父組件代碼如下:
<template>
<div id="demo">
<test-model v-model="haorooms"></test-model>
<span>{{haorooms}}</span>
</div>
</template>
<script>
import testModel from 'src/components/testModel'
export default {
data(){
return{
haorooms: "haorooms"
}
},
components: {
testModel,
}
}
</script>
<style lang="scss" scoped>
</style>
子組件代碼如下:
<template>
<span>
<input
ref="input"
:value="value"
@input="$emit('balabala', $event.target.value)"
>
</span>
</template>
<script>
export default {
data(){
return{
}
},
props: ["value"],
model: {
prop: 'value',
event: 'balabala'
}
}
</script>
<style lang="scss" scoped>
</style>
我們可以通過上面代碼,子組件修改父組件v-model綁定的值!
實(shí)現(xiàn)截圖如下:

v-model 的缺點(diǎn)和解決辦法
在創(chuàng)建類似復(fù)選框或者單選框的常見組件時(shí),v-model就不好用了。
<input type="checkbox" v-model="haorooms" />
我們可以用如下方式解決:
<input type="checkbox" :checked="status" @change="status = $event.target.checked" />
父組件可以如下寫:
<my-checkbox v-model="haorooms"></my-checkbox>
子組件:
<input
type="checkbox"
<!--這里就不用 input 了,而是 balabala-->
@change="$emit('balabala', $event.target.checked)"
:checked="value"
/>
export default {
data(){
return{
}
},
props: ['checked'], //這里就不用 value 了,而是 checked
model: {
prop: 'checked',
event: 'balabala'
},
}
關(guān)于vue的v-model就寫到這里。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
vue項(xiàng)目中實(shí)現(xiàn)el-dialog組件可拖拽效果
本文主要介紹了vue項(xiàng)目中實(shí)現(xiàn)el-dialog組件可拖拽效果,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
如何利用vue-cli監(jiān)測(cè)webpack打包與啟動(dòng)時(shí)長(zhǎng)
這篇文章主要給大家介紹了關(guān)于如何利用vue-cli監(jiān)測(cè)webpack打包與啟動(dòng)時(shí)長(zhǎng)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02
Vite項(xiàng)目搭建與環(huán)境配置的完整版教程
Vite?使用?Rollup?作為默認(rèn)的構(gòu)建工具,可以將應(yīng)用程序的源代碼打包成一個(gè)或多個(gè)優(yōu)化的靜態(tài)文件,本文就來為大家介紹一下Vite如何進(jìn)行項(xiàng)目搭建與環(huán)境配置吧2023-09-09
Vue+ElementUI踩坑之動(dòng)態(tài)顯示/隱藏表格的列el-table-column問題
這篇文章主要介紹了Vue+ElementUI踩坑之動(dòng)態(tài)顯示/隱藏表格的列el-table-column問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
多個(gè)vue項(xiàng)目復(fù)用一個(gè)node_modules的問題
這篇文章主要介紹了多個(gè)vue項(xiàng)目復(fù)用一個(gè)node_modules的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
vite+vue3+tsx項(xiàng)目打包后動(dòng)態(tài)路由無法加載頁面的問題及解決
這篇文章主要介紹了vite+vue3+tsx項(xiàng)目打包后動(dòng)態(tài)路由無法加載頁面的問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
vuejs+element UI table表格中實(shí)現(xiàn)禁用部分復(fù)選框的方法
今天小編就為大家分享一篇vuejs+element UI table表格中實(shí)現(xiàn)禁用部分復(fù)選框的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09
在vue中created、mounted等方法使用小結(jié)
這篇文章主要介紹了在vue中created、mounted等方法使用小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07

