vue項(xiàng)目中v-model父子組件通信的實(shí)現(xiàn)詳解
前言
我們在vue項(xiàng)目中,經(jīng)常有這樣的需求,父組件綁定v-model,子組件輸入更改父組件v-model綁定的數(shù)值。很多朋友對這種操作不是很清楚,這需要對v-model有比較深入的了解,今天談?wù)剉-model。
vue的雙向數(shù)據(jù)綁定
v-model這個指令只能用在<input>, <select>,<textarea>這些表單元素上,所謂雙向綁定,指的就是我們在js中的vue實(shí)例中的data與其渲染的dom元素上的內(nèi)容保持一致,兩者無論誰被改變,另一方也會相應(yīng)的更新為相同的數(shù)據(jù)。
這個問題在很多前端面試中,會提及。面試官問你,vue的雙向數(shù)據(jù)綁定原理是什么?當(dāng)然,這個也是耳熟能詳?shù)膯栴},百度隨便一搜索,到處都能找到答案。
一般都會搜索到,是用Object.defineProperty( ) ,來監(jiān)聽數(shù)據(jù)get和set,來實(shí)現(xiàn)數(shù)據(jù)劫持的。
假如對Object.defineProperty( )不是很了解,可以點(diǎn)擊上面鏈接,看看其語法!
舉個簡單的例子:
var blog = { name: 'haorooms博客' }; console.log(blog.name); // haorooms博客
如果想要在執(zhí)行console.log(blog.name)
的同時,直接給haorooms博客加個書名號,那要怎么處理呢?或者說要通過什么監(jiān)聽對象 blog的屬性值。這時候Object.defineProperty( )
就派上用場了,代碼如下:
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 的使用
上面開了一個小差,講了那么多,其實(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í)只是第二行的語法糖。然后第二行代碼還能簡寫成這樣:
<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)行父子組件的通信?如何在組件中使用呢?假如你理解了我上面的例子,那么,我們就可以很簡單的在組件中使用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ù)選框或者單選框的常見組件時,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é)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Vue子組件props從父組件接收數(shù)據(jù)并存入data
這篇文章主要介紹了Vue子組件props從父組件接收數(shù)據(jù)并存入data的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08vue實(shí)現(xiàn)一個矩形標(biāo)記區(qū)域(rectangle marker)的方法
這篇文章主要介紹了vue實(shí)現(xiàn)一個矩形標(biāo)記區(qū)域 rectangle marker的方法,幫助大家實(shí)現(xiàn)區(qū)域標(biāo)記功能,感興趣的朋友可以了解下2020-10-10nginx+vite項(xiàng)目打包以及部署的詳細(xì)過程
我們使用nginx部署Vue項(xiàng)目,實(shí)質(zhì)上就是將Vue項(xiàng)目打包后的內(nèi)容同步到nginx指向的文件夾,下面這篇文章主要給大家介紹了關(guān)于nginx+vite項(xiàng)目打包以及部署的相關(guān)資料,需要的朋友可以參考下2023-01-01vue前端實(shí)現(xiàn)導(dǎo)出頁面為pdf(分頁導(dǎo)出、不分頁導(dǎo)出及分模塊導(dǎo)出)
在實(shí)際應(yīng)用中可能用戶希望將系統(tǒng)中一個頁面展示的所有數(shù)據(jù)報表,用PDF的文件格式下載下來,以便于其他用途,這篇文章主要給大家介紹了關(guān)于vue前端實(shí)現(xiàn)導(dǎo)出頁面為pdf(分頁導(dǎo)出、不分頁導(dǎo)出及分模塊導(dǎo)出)的相關(guān)資料,需要的朋友可以參考下2024-06-06vue3網(wǎng)絡(luò)請求添加loading過程
這篇文章主要介紹了vue3網(wǎng)絡(luò)請求添加loading過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08vue2.0與bootstrap3實(shí)現(xiàn)列表分頁效果
這篇文章主要為大家詳細(xì)介紹了vue2.0與bootstrap3實(shí)現(xiàn)列表分頁效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11vue實(shí)現(xiàn)動態(tài)綁定行內(nèi)樣式style的backgroundImage
這篇文章主要介紹了vue實(shí)現(xiàn)動態(tài)綁定行內(nèi)樣式style的backgroundImage方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07