Vue 2はv-modelを利用してコンポーネントpropsの双方向バインドを実現する優美な解決策である.
2648 ワード
プロジェクトでvue 2を使用してプロジェクトを構築し始めました.vue 1とは大きく異なり、propsの双方向バインドがキャンセルされ、親から子にしか伝わらない一方向データストリームに変更されました.初心はもちろんいいですが、双方向バインドがプロジェクトで発生しやすいデータの混乱を避けるためです.
それからネットやgithubの案などを参考にして、多くの解決策がこのようなものであることを発見しました. dataオブジェクトでpropsプロパティのコピーを作成する watch props属性dataコピーを付与コンポーネント外のpropsに対する修正 を同期する watch dataコピー、emit関数はコンポーネント外 に通知される.
ここでは最も一般的なmodalを例に挙げます.modalは双方向バインドに適しており、外部はコンポーネントの表示または非表示を制御することができ、コンポーネント内部の閉鎖はvisible属性の非表示を制御することができ、visible属性は外部に同期して伝送されます.
これにより、コンポーネントpropsの双方向バインドの問題が解決されます.しかし、あまり美しくない現象は、親がmodalコンポーネントを呼び出すときにmodalVisibleChangeのmethodsを書く必要があることです.このコードはいつも余計に見えます.特に他人に使わせる公共コンポーネントを書くのは面倒です.methodを書かずにpropsの双方向バインドを実現できるかどうか、答えはいいです.
それはv-modelを利用してvalueを使用してv-modelの値を保存し、双方向にバインドすることです.
次のコードに変更します.
このようにコンポーネントを呼び出すコードが簡潔であるかどうかは、他の人が呼び出すと簡単で、isShowを設定すればmodalコンポーネントの表示や非表示を制御できるとともに、modalコンポーネント内部の閉じるボタンが閉じると、ステータスがisShowに伝わります
ソリューション1
それからネットやgithubの案などを参考にして、多くの解決策がこのようなものであることを発見しました.
ここでは最も一般的なmodalを例に挙げます.modalは双方向バインドに適しており、外部はコンポーネントの表示または非表示を制御することができ、コンポーネント内部の閉鎖はvisible属性の非表示を制御することができ、visible属性は外部に同期して伝送されます.
///modal.vue
X
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;
}
}
}
/// modal
export default {
name: 'app',
data () {
return {
isShow:true,
}
},
methods:{
modalVisibleChange(val){
this.isShow = val;
}
}
}
これにより、コンポーネントpropsの双方向バインドの問題が解決されます.しかし、あまり美しくない現象は、親がmodalコンポーネントを呼び出すときにmodalVisibleChangeのmethodsを書く必要があることです.このコードはいつも余計に見えます.特に他人に使わせる公共コンポーネントを書くのは面倒です.methodを書かずにpropsの双方向バインドを実現できるかどうか、答えはいいです.
優れたソリューション
それはv-modelを利用してvalueを使用してv-modelの値を保存し、双方向にバインドすることです.
次のコードに変更します.
X
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;
}
}
}
/// modal
export default {
name: 'app',
data () {
return {
isShow:false
}
}
}
このようにコンポーネントを呼び出すコードが簡潔であるかどうかは、他の人が呼び出すと簡単で、isShowを設定すればmodalコンポーネントの表示や非表示を制御できるとともに、modalコンポーネント内部の閉じるボタンが閉じると、ステータスがisShowに伝わります