问题及原因
【问题】
在后端接口返回的对象中再添加一个新的属性,但是在添加属性过后。视图层却没有同步更新。
如
data(){
return{
demolist:[{name:"Jack",age:15},{name:"Bob",age:12}],
}
}
methods:{
demoListDone(){
this.demolist[0].name="Lucy" //改变在data中已定义的数据属性name,视图层会渲染
this.demolist[0].weight="50kg" //在原有对象上添加新属性weight,视图层不渲染
}
}
【原因】
Vue 不能检测到对象属性的【添加】或【删除】。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的。
如上,this.demolist[0].name,在页面初始化时,在data对象上是已存在的,所以它是可响应的
而this.demolist[0].weight,在页面初始化时,data对象上并未对其做定义,即没有执行getter/setter 转化过程,所以该属性是不响应的。
解决办法
如上所述,既然我们新添加的属性没有得到vue的getter/setter转化,那么我们可以自己去主动转化我们所添加的新属性。
Vue 不允许在已经创建的实例上动态添加新的根级响应式属性(root-level reactive property)。然而它可以使用 Vue.set(object, key, value) 方法将响应属性添加到嵌套的对象上:
Vue.set(this.demolist[0], 'weight', '50kg')
我们还可以使用 vm.$set 实例方法,这也是全局 Vue.set 方法的别名:
this.$set(this.demolist[0], 'weight', '50kg')
拓展 --- 如果你还不懂,或者想了解更多: