在使用 vue 进行开发时,有时需要向data中的某个对象添加属性,若采用传统的对象添加属性的方法:
<template>
<div>
<div>{{userInfo.userName}}</div>
<div>{{userInfo.userAge}}</div>
<button @click="showUserAge">显示年龄</button>
<button @click="increaseUserAge">增加年龄</button>
</div>
</template>
<script>
export default {
name: "test",
data() {
return {
userInfo: {
userName: 'test'
}
}
},
methods: {
showUserAge() {
this.userInfo.userAge = 18; //传统的添加属性的方法
console.log(this.userInfo);
},
increaseUserAge() {
this.userInfo.userAge++;
console.log(this.userInfo);
}
}
}
</script>
点击显示年龄,会发现视图无法更新,年龄无法显示:

控制台输出可以看到对象中是已经添加了这个属性的:

根据官方文档定义:如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。 其实仔细看控制台的信息,可以发现在下面有一对关于 userName 的 get 和 set 方法:

结论
如果一个数据没有vue为其添加的getter/setter方法,则不会更新到视图上。
解决方法
使用 this.$set(object,key,value)
methods: {
showUserAge() {
//this.userInfo.userAge = 18;
this.$set(this.userInfo, 'userAge', 18); //使用this.$set(object,key,value)
console.log(this.userInfo);
},
increaseUserAge() {
this.userInfo.userAge++;
console.log(this.userInfo);
}
}
点击显示年龄:

