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>