自定義Vue中的v-module雙向綁定的實(shí)現(xiàn)
v-module 雙向綁定實(shí)際上就是通過(guò)子組件中的 $emit
方法派發(fā) input 事件,父組件監(jiān)聽(tīng) input 事件中傳遞的 value 值,并存儲(chǔ)在父組件 data 中;然后父組件再通過(guò) prop 的形式傳遞給子組件 value 值,再子組件中綁定 input 的 value 屬性即可。
我們著手實(shí)現(xiàn)一遍:
子組件傳值
首先子組件需要一個(gè) input 標(biāo)簽,這個(gè) input 標(biāo)簽需要綁定 input 事件,$emit
觸發(fā)父組件的 input 事件,通過(guò)這種方法子組件傳遞值給父組件
<input type="text" @input="$emit('input', $event.target.value)">
父組件監(jiān)聽(tīng) input 事件,然后將事件攜帶的 input 輸入的值傳入到 data 狀態(tài)中
<my-comp @input="value = $event"></my-comp>
export default { // ... data () { return { value: 'initial value' // 維護(hù)一個(gè) value 狀態(tài) } } }
至此子組件監(jiān)聽(tīng) input 事件,用戶(hù)輸入字符串即可被父組件獲取到并保存在 data 狀態(tài)中
父組件傳值
然后父組件還需要將 value 值傳遞給子組件,子組件再綁定 value 值到 input 的 value 屬性上
<my-comp :value="value" @input="value = $event"></my-comp>
增加 :value="value"
通過(guò) prop 傳遞 value
子組件中綁定 input 的 value 屬性
<input type="text" @input="$emit('input', $event.target.value)" :value="value">
注意 props 中需要設(shè)定 value
export default { name: 'MyComp', props: ['value'] }
至此自定義的 v-module 處理完畢,看看效果:
其他元素使用 v-model
在 input 上使用 v-model 比較簡(jiǎn)單,但考慮到其他元素不一定是要監(jiān)聽(tīng) input 事件而是 change 事件,也不一定是 value 屬性改變?cè)氐膬?nèi)容。比如 checkbox,我們就需要監(jiān)聽(tīng) change 事件,以及 checked 屬性。
那么先手動(dòng)實(shí)現(xiàn)一遍:
<input type="checkbox" @change="$emit('change', $event.target.checked)" :checked="checked">
子組件首先監(jiān)聽(tīng) change 事件,并 $emit
方法觸發(fā)父組件的 change 事件,將 checked 屬性值傳入給父組件;同時(shí)接收父組件傳遞進(jìn)來(lái)的 checked 值,根據(jù) checked 值決定 input 元素的 checked 屬性。
export default { name: 'MyComp', props: ['checked'] }
然后需要修改父組件:
<my-comp @change="checked = $event"></my-comp>
export default { // ... data () { return { checked: false } } }
父組件監(jiān)聽(tīng) change 事件,并在 data 中維護(hù)狀態(tài) checked,默認(rèn)值為 false
最后看看效果:
直接使用 v-model 指令
此外還可直接使用 v-model 指令:
<my-comp v-model="checked"></my-comp>
但需要在組件中修改 v-model 指令,指定 prop 和 event:
export default { name: 'MyComp', props: ['checked'], model: { prop: 'checked', event: 'change' } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vue實(shí)現(xiàn)側(cè)邊菜單欄手風(fēng)琴效果實(shí)例代碼
本文通過(guò)一段簡(jiǎn)單的代碼給大家介紹了基于純vue實(shí)現(xiàn)側(cè)邊菜單欄手風(fēng)琴效果,代碼很簡(jiǎn)單,感興趣的朋友跟隨腳本之家小編一起看看吧2018-05-05vue實(shí)現(xiàn)父子組件之間的通信以及兄弟組件的通信功能示例
這篇文章主要介紹了vue實(shí)現(xiàn)父子組件之間的通信以及兄弟組件的通信功能,結(jié)合實(shí)例形式分析了vue.js組件間通信相關(guān)操作技巧,需要的朋友可以參考下2019-01-01Vue使用Vue-cropper實(shí)現(xiàn)圖片裁剪
這篇文章主要為大家詳細(xì)介紹了Vue使用Vue-cropper實(shí)現(xiàn)圖片裁剪,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05為vue-router懶加載時(shí)下載js的過(guò)程中添加loading提示避免無(wú)響應(yīng)問(wèn)題
這篇文章主要介紹了為vue-router懶加載時(shí)下載js的過(guò)程中添加loading提示避免無(wú)響應(yīng)問(wèn)題,需要的朋友可以參考下2018-04-04Vue使用swiper問(wèn)題(5.2.0版本,避免踩坑)
這篇文章主要介紹了Vue使用swiper問(wèn)題(5.2.0版本,避免踩坑),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04Vue 中如何利用 new Date() 獲取當(dāng)前時(shí)間
在 Vue 開(kāi)發(fā)中,利用 new Date() 方法可以方便地獲取當(dāng)前時(shí)間,并通過(guò) Date 對(duì)象的方法進(jìn)行時(shí)間格式化和操作。通過(guò)本文的介紹,您應(yīng)該對(duì)在 Vue 中獲取當(dāng)前時(shí)間有了更深入的了解,并了解了一些常見(jiàn)的時(shí)間操作方法,需要的朋友可以參考下2023-07-07淺談vue中使用圖片懶加載vue-lazyload插件詳細(xì)指南
本篇文章主要介紹了淺談vue中使用圖片懶加載vue-lazyload插件詳細(xì)指南,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-10-10vue 中使用 watch 出現(xiàn)了如下的報(bào)錯(cuò)的原因分析
這篇文章主要介紹了vue 中使用 watch 出現(xiàn)了如下的報(bào)錯(cuò)信息的原因分析及解決方法,本文附有代碼解決方案,非常不錯(cuò),需要的朋友可以參考下2019-05-05Vue計(jì)算屬性實(shí)現(xiàn)成績(jī)單
這篇文章主要為大家詳細(xì)介紹了Vue計(jì)算屬性實(shí)現(xiàn)成績(jī)單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08Vue項(xiàng)目打包優(yōu)化實(shí)踐指南(推薦!)
如果引入的庫(kù)眾多,那么vendor.js文件體積將會(huì)相當(dāng)?shù)拇?影響首開(kāi)的體驗(yàn),這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目打包優(yōu)化實(shí)踐的相關(guān)資料,需要的朋友可以參考下2022-06-06