在项目中最先运用vue2来构建项目了,跟 vue1 很大的一处差别在于2 取消了props 的双向绑定,改成只能从父级传到子级的单向数据流,初志当然是好的,为了防止双向绑定在项目中轻易形成的数据杂沓。
处理计划一
然后最先参考网上和github上的计划等等,发明许多处理计划是如许的
用data对象中建立一个props属性的副本
watch props属性 给予data副本 来同步组件外对props的修正
watch data副本,emit一个函数 关照到组件外
这里以最常见的 modal为例子:
modal挺适宜双向绑定的,外部能够掌握组件的 显现或许隐蔽,组件内部的封闭能够掌握 visible属性隐蔽,同时visible 属性同步传输到外部
///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>
///挪用modal组件
<modal :value="isShow" @visible-change="modalVisibleChange"></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的值,举行双向绑定
改成以下代码:
<template>
<div class="modal" :value="value" v-show="visible">
<div class="close" @click="cancel">X</div>
</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>
///挪用modal组件
<modal v-model="isShow"></modal>
export default {
name: 'app',
data () {
return {
isShow:false
}
}
}
</script>
如许挪用组件的代码是否是很简约,其他职员要挪用的话,会很轻松,只需设置 isShow 就能够掌握 modal 组件的显现或许隐蔽,同时 如果是modal 组件内部封闭按钮封闭的,状况也会传到 isShow