Vue2.0利用 v-model 實(shí)現(xiàn)組件props雙向綁定的優(yōu)美解決方案
在項(xiàng)目中開始使用vue2來構(gòu)建項(xiàng)目了,跟 vue1 很大的一處不同在于2 取消了props 的雙向綁定,改成只能從父級(jí)傳到子級(jí)的單向數(shù)據(jù)流,初衷當(dāng)然是好的,為了避免雙向綁定在項(xiàng)目中容易造成的數(shù)據(jù)混亂。
解決方案一
然后開始參考網(wǎng)上和github上的方案等等,發(fā)現(xiàn)很多解決方案是這樣的
- 用data對(duì)象中創(chuàng)建一個(gè)props屬性的副本
- watch props屬性 賦予data副本 來同步組件外對(duì)props的修改
- watch data副本,emit一個(gè)函數(shù) 通知到組件外
這里以最常見的 modal為例子:modal挺合適雙向綁定的,外部可以控制組件的 顯示或者隱藏,組件內(nèi)部的關(guān)閉可以控制 visible屬性隱藏,同時(shí)visible 屬性同步傳輸?shù)酵獠?/p>
///modal.vue 組件
<template>
<div class="modal" v-show="visible">
<div class="close" @click="cancel">X</div>
</div>
</template>
<script>
export default {
name:'modal',
props: {
value: {
type: Boolean,
default:false
}
},
data () {
return {
visible:false
}
},
watch:{
value(val) {
console.log(val);
this.visible = val;
},
visible(val) {
this.$emit("visible-change",val);
}
},
methods:{
cancel(){
this.visible = false;
}
},
mounted() {
if (this.value) {
this.visible = true;
}
}
}
</script>
///調(diào)用modal組件
<modal :value="isShow" @visible-change="modalVisibleChange"></modal>
export default {
name: 'app',
data () {
return {
isShow:true,
}
},
methods:{
modalVisibleChange(val){
this.isShow = val;
}
}
}
這樣就解決了 組件props 雙向綁定的問題。 但是這樣有一個(gè)不是太美觀的現(xiàn)象就是 在父級(jí)調(diào)用 modal組件的時(shí)候,還需要寫一個(gè) modalVisibleChange 的methods. 總是顯得這部分代碼是多余的。 特別是寫一個(gè)讓別人用的公共組件,這樣調(diào)用太麻煩了。能不能不寫method來實(shí)現(xiàn)props的雙向綁定呢,答案是可以的。
優(yōu)美解決方案
那就是利用 v-model, 在組件內(nèi)部放置一個(gè) 隱藏的input 控件來保存v-model的值,進(jìn)行雙向綁定
改成如下代碼:
<template>
<div class="modal" v-show="visible">
<div class="close" @click="cancel">X</div>
<input type="text" :value="value" style='display:none;'>
</div>
</template>
<script>
export default {
props: {
value: {
type: Boolean,
default:false
}
},
data () {
return {
visible:false
}
},
watch:{
value(val) {
console.log(val);
this.visible = val;
},
visible(val) {
this.$emit('input', val);
}
},
methods:{
cancel(){
this.visible = false;
}
},
mounted() {
if (this.value) {
this.visible = true;
}
}
}
</script>
///調(diào)用modal組件
<modal v-model="isShow"></modal>
export default {
name: 'app',
data () {
return {
isShow:false
}
}
}
</script>
這樣調(diào)用組件的代碼是不是很簡(jiǎn)潔,其他人員要調(diào)用的話,會(huì)很輕松,只要設(shè)置 isShow 就可以控制 modal 組件的顯示或者隱藏,同時(shí) 如果是modal 組件內(nèi)部關(guān)閉按鈕關(guān)閉的,狀態(tài)也會(huì)傳到 isShow。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 在Vue2中v-model和.sync區(qū)別解析
- vue2和vue3組件v-model區(qū)別詳析
- Vue2子組件綁定 v-model,實(shí)現(xiàn)父子組件通信方式
- vue2中如何自定義組件的v-model
- Vue v-model相關(guān)知識(shí)總結(jié)
- vue2 v-model/v-text 中使用過濾器的方法示例
- vue 2.0組件與v-model詳解
- vue2 如何實(shí)現(xiàn)div contenteditable=“true”(類似于v-model)的效果
- vue2與vue3雙向數(shù)據(jù)綁定的區(qū)別說明
- vue 2 實(shí)現(xiàn)自定義組件一到多個(gè)v-model雙向數(shù)據(jù)綁定的方法(最新推薦)
相關(guān)文章
Vue2中無法監(jiān)聽數(shù)組和對(duì)象的某些變化問題
這篇文章主要介紹了Vue2中無法監(jiān)聽數(shù)組和對(duì)象的某些變化問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
Vue2中如何使用全局事件總線實(shí)現(xiàn)任意組件間通信
全局事件總線就是一種組件間通信的方式,適用于任意組件間通信,下面這篇文章主要給大家介紹了關(guān)于Vue2中如何使用全局事件總線實(shí)現(xiàn)任意組件間通信的相關(guān)資料,需要的朋友可以參考下2022-12-12
一篇文章帶你使用Typescript封裝一個(gè)Vue組件(簡(jiǎn)單易懂)
這篇文章主要介紹了使用Typescript封裝一個(gè)Vue組件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Element-UI el-calendar樣式如何修改日歷
這篇文章主要介紹了Element-UI el-calendar樣式如何修改日歷問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
vue自定義table表如何實(shí)現(xiàn)內(nèi)容上下循環(huán)滾動(dòng)
這篇文章主要介紹了vue自定義table表如何實(shí)現(xiàn)內(nèi)容上下循環(huán)滾動(dòng)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
vue復(fù)合組件實(shí)現(xiàn)注冊(cè)表單功能
這篇文章主要為大家詳細(xì)介紹了vue復(fù)合組件實(shí)現(xiàn)注冊(cè)表單功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
vue中給el-radio添加tooltip并實(shí)現(xiàn)點(diǎn)擊跳轉(zhuǎn)方式
這篇文章主要介紹了vue中給el-radio添加tooltip并實(shí)現(xiàn)點(diǎn)擊跳轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04

