由于 vue 入门极其简单,以至于我们很容易忽略 data 的定义 和 操作带来的坑
data() {
return {
obj: {}
}
},
mounted: {
// 以下 3 种使用方式 视图更新
// 1
this.obj = { a:1, b: 2 }
// 2, 等价于 1
this.obj = Object.assign({}, this.obj, { d: 4 })
// 3
this.$set(this.obj, 'e', 5)
// 以下 3 种使用方式,视图不会更新
// 1
this.obj.c = 3
// 2
Object.assign(this.obj, { d: 4 })
// 3
this.obj = Object.assign(this.obj, { d: 4 })
// 注意:即使 obj 里面有些 key 是 object 或 array 也正常
this.obj = { object: { a: 3, b: 4, arr: [1,2,3] }, array: [1, 2, 3, { x: 8, y: 9 }] }
}
我们经常会碰到一个场景,前端同学不太想定义(偷懒) data.obj 的所有的 key, 就想等着后端接口加载完,再统一赋值给 data.obj, 此时我需要接上例中的视图更新的 方式 1 或 2 直接赋值给 data.obj,这样在模板里做好判断,不会出问题,可以正常跑 但事先不定义好 data.obj 的所有 key, 代码维护起来很抓狂。
对此 vue 的文档上也讲的很明白,也可以参考下 深入响应式原理 https://v2.cn.vuejs.org/v2/guide/reactivity.html