vue2父子组件双向数据绑定

在有些情况下,我们可能需要对一个 prop 进行“双向绑定”。不幸的是,真正的双向绑定会带来维护上的问题,因为子组件可以修改父组件,且在父组件和子组件都没有明显的改动来源。

所以就推荐以update:myPropName  的模式触发事件取而代之。举个例子,在一个包含 title prop 的假设的组件中,我们可以用以下方法表达对其赋新值的意图:

this.$emit('update:title', newTitle)

然后父组件可以监听那个事件并根据需要更新一个本地的数据属性。例如:

<text-document
  v-bind:title="doc.title"
  v-on:update:title="doc.title = $event"
></text-document>

为了方便起见,我们为这种模式提供一个缩写,即 .sync 修饰符:

<text-document v-bind:title.sync="doc.title"></text-document>

例子:

父组件:parent.vue

<template>
  <div >
    //input实时改变num的值, 并且会实时改变div里的内容
    <input type="text" v-model="num">
    <child:childnum.sync="num" ></child>
  </div>
</template>
<script>
import child  from './child.vue'  //引入child子组件
export default {
  data() {
    return {
      num: ''
    }
  },
  components: {
    child
  }  
}
</script>

子组件:child.vue

<template>
  <div>
    <div>
      <input type="text" v-model="str">
    </div>
    //childnum是父元素传过来的
    <h2>{{ childnum }}</h2>
  </div>
</template>
<script>
export default {
  data() {
    return {
      str: '',
    }
  },
  props:["childnum”]
  watch: {
    str: function(newValue, oldValue) {
      //每当str的值改变则发送事件update:childnum , 并且把值传过去
      this.$emit('update:childnum', newValue)
    }
  }
}
</script>

 

posted @ 2020-02-10 22:51  到此灬一游丿  阅读(149)  评论(0编辑  收藏  举报