在我们开发Vue的应用过程中,有一个父子组件通信的需求是很常用的:父组件 Parent 存在属性 d ,通过参数p 传输给子组件Child,我们希望Child组件能改变Parent的属性 d 。在没有修饰符 .sync 的情况下,我们的一般方法是这样的:
- 父组件监听子组件事件
update:p,并且将参数p绑定为d - 子组件触发
update:p事件并向该事件传入父组件属性d的新值 - 父组件的事件处理函数触发,处理函数根据传入的新值改变组件的属性
d
具体代码如下:
/ Parent
<template>
<Child :p="d" v-on:update:p="d = $event" />
</template>
<script>
export default {
data() {
return {
d: 0
}
}
}
</script>
// Child
<template>
<div @click="$emit('update:p', 'p+1')">child</div>
</template>
<script>
export default {
props:{
p: Number
}
}
</script>
由于父组件的模式是固定的,所以Vue引入了.sync来简写这种模式,简写后的代码如下:
<Child :p.sync="d" />
字面意义就是说子组件参数p 值与父组件的属性d值同步(synchronize),子组件调用 update:p 方法表面上是更新参数p,实际上是通过更新父组件的属性d来更新参数p,Vue把事件取名为这个是估计是想更通俗易懂一点。