修改数据页面不更新的原因和解决方案
Posted 李耀书
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了修改数据页面不更新的原因和解决方案相关的知识,希望对你有一定的参考价值。
在Vue
项目中,有时候在我们修改或者添加新的对象属性后,明明data
中的数据已经更新了,但是页面依旧没有更新。
1、分析:
在vue2
中是通过Object.defineProperty
对于data
中的数据进行数据劫持,实现数据的双向绑定的。
defineReactive: function(data, key, val) {
//为data中所有层次的属性都创建一个dep实例
var dep = new Dep();
//递归遍历data中所有层次的属性
var childObj = observe(val);
//为原有属性新增get和set方法(数据劫持)
Object.defineProperty(data, key, {
enumerable: true, // 可枚举
configurable: false, // 不能再define
get: function() {
//判断当前Dep.target的watcher是否存在
if (Dep.target) {//当模版初始化的时候会赋值watcher实例到target上
//调用dep的depend方法
dep.depend();
}
return val;
},
set: function(newVal) {
if (newVal === val) {
return;
}
val = newVal;
// 新的值是object的话,进行监听
childObj = observe(newVal);
// 通知订阅者
dep.notify();
}
});
}
解析:
通过
Object.defineProperty
对data
中的数据进行数据劫持,组件在初始化的时候,对数据进行了递归遍历,让data
中的每一个属性都拥有了get和set
方法。但是在之后新加的数据中,并没有Object.defineProperty
这个方法设置的响应式数据,至此修改后的视图并不能更新。
2、如何解决
在Vue
中是不允许在已经创建的实例上动态添加新的根级响应式属性,但是我们可以通过这些方法,进行解决。
Vue.set()
Object.assign()
this.$forceUpdated()
第一种:
Vue.set()
通过Vue.set()
的方法将响应式的方法嵌套在新增的对象上。
Vue.set(object, key, value)
/*
object:要修改的对象或者数组。
key:属性或者下标,
value:修改后的value值。
*/
第二种:
Object.assign()
方法用于对象的合并,将源对象的所有可枚举属性,复制到目标对象。
const obj = Object.assign({},this.item,{newProperty:'新值'})
注意:
直接使用Object.assign()
添加对象的新的属性是不会触发更新的。
第三种:
this.$forceUpdated()
通过this.$forceUpdated()
对页面进行强制的刷新。
this.$forceUpdate();
拓展:
在Vue3
中,Vue
是通过Proxy
实现数据的响应式的。
以上是关于修改数据页面不更新的原因和解决方案的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 数据库 - 使用UEStudio修改dmp文件版本号,解决imp命令恢复的数据库与dmp本地文件版本号不匹配导致的导入失败问题,“ORACLE error 12547”问题处理(代码片段