在Vue组件中,通常使用props
来接收父组件传递的数据,并通过$emit
来向父组件发送事件。但是,当需要在子组件中修改父组件传递的数据时,就需要手动触发$emit
来更新父组件的数据。为了简化这个过程,Vue提供了sync
修饰符。
使用sync
修饰符时,父组件传递给子组件的属性需要以.sync
的形式进行绑定,例如::foo.sync="bar"
。这样,在子组件内部修改foo
属性的值时,会自动触发一个名为update:foo
的事件,父组件可以通过监听这个事件来更新bar
的值。
举个例子,假设有一个父组件:
<template>
<div>
<child-component :name.sync="childName"></child-component>
<p>Child Name: {{ childName }}</p>
</div>
</template>
<script>
export default {
data() {
return {
childName: 'John',
}
}
}
</script>
子组件child-component
可以接收name
属性,并且通过sync
修饰符实现双向绑定,即修改子组件内部的name
属性时会自动更新父组件的childName
属性。子组件的代码如下:
<template>
<div>
<input type="text" v-model="localName">
</div>
</template>
<script>
export default {
props: ['name'],
data() {
return {
localName: this.name,
}
},
watch: {
localName(newVal) {
this.$emit('update:name', newVal);
}
}
}
</script>
在子组件中,通过props
接收父组件传递的name
属性,并将其赋值给localName
。然后,通过watch
监听localName
的变化,当localName
发生变化时,触发update:name
事件并传递新的值给父组件。
这样,当在子组件中输入框中修改localName
时,父组件的childName
属性也会自动更新。