问题
在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向数组对象中添加新的属性,如果直接更新此属性的值,是不会更新视图的。
根据官方文档定义:如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。
实现
HTML部分
<div id="app">
<ul>
<li v-for="value in obj" :key="value">
{{value}}
</li>
</ul>
<button @click="addObjB">添加obj.b</button>
</div>
JS部分
data() {
return {
obj: {
a: "obj.a"
}
}
},
methods: {
addObjB() {
// 默认情况下
// this.obj.b = "obj.b"
// 第一种解决方法
// let obj = {
// a: "obj.a",
// b: "obj.b"
// };
// this.obj = obj
// 第二种解决方法
// this.$set(this.obj,"b","obj.b")
}
}
默认情况下点击button会发现, obj.b 已经成功添加,但是视图并未刷新
原因在于在Vue实例创建时, obj.b 并未声明,因此就没有被Vue转换为响应式的属性,自然就不会触发视图的更新,这时就需要使用Vue的全局api—— $set()
$set() 方法相当于手动的去把 obj.b 处理成一个响应式的属性,此时视图也会跟着改变了
开发过程中我用的是第一种方法解决的,但是不好的地方就是比较麻烦,很多场景实现起来非常不友好。
用vue官方提供的$set就好了Vue.set( target, propertyName/index, value )
参考:
1.Vue中给data中的对象属性添加一个新的属性时会发生什么,如何解决?
2.Vue--给data数据中对象新增属性/响应式数据(使用Vue.$set()),并触发视图更新
多多更新吧
hihi 你好呀
测试一下评论~
回复你一下
测试评论