关于Vue中更新数据视图不更新的几种解决方法
数据驱动视图一直是 Vue 的两大核心之一,在开发中我经常会遇到数据更新了但是视图没有更新的情况,多数情况下是因为更改的数据并没有被 Vue 劫持到,从而无法触发 getter/setter,关于 Vue 的响应式原理就不过多解释了,官方文档有很好的说明链接放在下面了。我统计了几种常用的方法用于解决更新数据后视图没更新的情况,在下面作以记录。
Vue 深入响应式原理官方文档:https://cn.vuejs.org/v2/guide/reactivity.html
解决方案:
//在Vue中多半是某个对象动态添加的属性没有被劫持到
//可以使用Vue.set()或者$set()手动将数据添加到劫持列表里
data(){
return {
obj: {
name: 'zs',
},
}
};
methods:{
handle(){
this.obj.name = 'ls'; //触发响应式
this.obj.age = 18; //不触发视图更新
// 1.使用 set()
// $set 方法接收三个参数 第一个为要增加属性的对象 第二个为新增属性的key 第三个为新增属性的value
this.$set(this.obj, 'age', 18);
// 2.可直接赋值 更改已经被监听对象的内存地址 即可触发setter
this.obj = {
...this.obj,
age: 18
}
// 3. 使用Object.assign 拷贝对象中可枚举的属性
// 个人认为这种写法和第二种差不多
Object.assign(this, {
obj:{
...this.obj,
age: 18,
}
});
// 也可以使用这种方法
this.obj = Object.assign({}, this.obj, {age: 18});
}
};