结论:
将源对象和要加入属性的对象合并为一个新的对象赋值给要响应式的对象(源对象),vue会将源对象重新触发一遍Object.defineProperty依赖收集。
代码
const app = new Vue({
el: "#app",
data: () => {
msg: {
name: 'jingwei'
}
},
methods: {
addProperty() {
this.msg.age = 18; //(非响应式)
// 原则上这是一个赋值行为,所以vue会重新收集新对象的依赖
this.msg = Object.assign({}, this.msg, { age: 18 }); //(响应式)
}
}
})