.sync 修饰符 通过将 props 和$emit 结合起来就可以实现父子组件的双向通信。
<div id="app">
<div>{{bar}}</div>
<my-comp :foo.sync="bar"></my-comp>
<!-- <my-comp :foo="bar" @update:foo="val => bar = val"></my-comp> -->
</div>
<script>
new Vue({
el: "#app",
data: { bar: 0 }
});
Vue.component("my-comp", {
template: '<h3>{{foo}}</h3><div @click="increment">点我+1</div>',
data: function() {
return { copyFoo: this.foo };
},
props: ["foo"],
methods: {
increment: function() {
this.$emit("update:foo", ++this.copyFoo);
}
}
});
</script>
子组件通过“update:foo”事件将讲一个值传给父组件,父组件接收后再将这个值赋给变量“foo”,接着在通过 props 将这个“foo”,子组件又接收到了新值。就实现了双向通信。
<comp :foo="bar" @update:foo="val => bar = val"></comp>
在使用了.sync 后,被简化为
<my-comp :foo.sync="bar"></my-comp>
可以看出 sync 就是一个语法糖,简化了父子组件双向通信的写法。