参考文档:https://cn.vuejs.org/v2/guide/
sync修饰符用于简化子组件通知父元素更新传入参数这个动作的代码逻辑,可以参考如下示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>sync修饰符</title>
<script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 绑定单个属性 -->
<my-com-a :title.sync="title"></my-com-a>
<!-- 上下是等价的,但上面的写法更简洁 -->
<!--<my-com-a :title="title" @update:title="title = $event"></my-com-a>-->
<!-- 绑定对象 -->
<my-com-b v-bind.sync="obj"></my-com-b>
<!-- 上下是等价的,但上面的写法更简洁 -->
<!--<my-com-b :objkey="obj.objkey" @update:objkey="obj.objkey = $event"-->
<!--:objvalue="obj.objvalue" @update:objvalue="obj.objvalue = $event"></my-com-b>-->
</div>
<script>
Vue.component('my-com-a', {
template: '<div><span @click="changeA">{{title}}</span></div>',
props: ['title'],
methods: {
changeA: function () {
this.$emit("update:title", "it is new title by my-com-a.");
}
}
});
Vue.component('my-com-b', {
template: '<div><span @click="changeB">{{objkey}}---{{objvalue}}</span></div>',
props: ['objkey', 'objvalue'],
methods: {
changeB: function () {
this.$emit("update:objkey", "it is new key by my-com-b.");
}
}
});
new Vue({
el: '#app',
data: {
title: "it is title.",
obj: {
objkey: "it is key.",
objvalue: "it is value."
},
objkey: "it is key.",
objvalue: "it is value.",
},
computed: {
//如果是计算属性则无效
// obj: function () {
// return {
// objkey: this.objkey,
// objvalue: this.objvalue
// }
// }
}
});
</script>
</body>
</html>
可以看到使用sync修饰符后可以达到相同的效果:
注意点:
1.子组件通知父元素更新参数时必须带上“update:”,这在简写以后很容易被忽略;
2.当绑定的是对象时,这个对象不能是计算属性(计算属性无效,因为计算属性的依赖信息并没有被修改)。