Vue2 利用 v-model 实现组件props双向绑定的优美解决方案

在项目中开始使用vue2来构建项目了,跟 vue1 很大的一处不一样在于2 取消了props 的双向绑定,改为只能从父级传到子级的单向数据流,初衷固然是好的,为了不双向绑定在项目中容易形成的数据混乱。javascript

解决方案一

而后开始参考网上和github上的方案等等,发现不少解决方案是这样的vue

  1. 用data对象中建立一个props属性的副本java

  2. watch props属性 赋予data副本 来同步组件外对props的修改git

  3. watch data副本,emit一个函数 通知到组件外github

这里以最多见的 modal为例子:
modal挺合适双向绑定的,外部能够控制组件的 显示或者隐藏,组件内部的关闭能够控制 visible属性隐藏,同时visible 属性同步传输到外部app

///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的值,进行双向绑定this

改为以下代码:双向绑定

<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 组件内部关闭按钮关闭的,状态也会传到 isShowcode

相关文章
相关标签/搜索