关于Vue中的属性值无法与视图同步的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Vue中的属性值无法与视图同步的问题相关的知识,希望对你有一定的参考价值。

参考技术A

在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的。
这是为什么呢?
让我们来看官方文档是怎么写的:
受现代 javascript 的限制(以及废弃 Object.observe),Vue 不能检测到对象属性的添加或删除。由于 Vue会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue
转换它,这样才能让它是响应的。
例如:

我们首先在浏览器中查看 console.log(this.obj); 这句话的打印结果:

可以看出ValueA属性是有get 和 set方法的,而新增的ValueB属性是没有的。
让我们来触发三次增加ValueA的函数,网页打印结果如下:

同时页面上的显示情况:

由此看出,更新ValueA时,数据与视图会同步更新,而更新ValueB的时候数据会被更新而视图却不会被更新

解决方案
官方定义:
Vue 不允许在已经创建的实例上动态添加新的根级响应式属性 (root-level reactive property)。然而它可以使用 Vue.set(object, key, value) 方法将响应属性添加到嵌套的对象上:
Vue.set(data.obj, \'key\', value)
您还可以使用 vm.$set 实例方法,这也是全局 Vue.set 方法的别名:
this.$set(this.obj,\'e\',02)
上述实例解决如下:

再分别触发增加ValueA和ValueB的函数,视图与数据都进行了更新:

vue中data值改变但页面视图不刷新问题

问题的说明与解决

说明

  • 问题就在于vue页面视图的不更新
  • 在这里要注意一点,根据官方描述所得:当vue的data里面声明或者已经赋值过的对象或数组(包含对象值),向对象里面添加新的属性和更新这个新属性的值,页面视图是不会更新的。

解决

  • 要想更新数据的时候视图也更新,可以使用 $set 或者 Object.assign 来解决
    添加新属性的时候,使用下面的方法
export default {
      data() {
            return {
                  obj: {
                        a: 1,
                        b: 2
                  }
            }
      }
}
// 给obj添加新属性
// 1
this.$set(this.obj1, ‘c‘, 3)
// 2
Object.assign({}, this.obj, { c: 3 })
  • 此处简单做个介绍,欲了解更多请移步下方官方文档???,点击下方链接即可

官方深入响应式原理


以上是关于关于Vue中的属性值无法与视图同步的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于MVC视图下拉菜单绑定与取值的问题

关于vue无法侦听数组及对象属性的变化的解决方案

关于在VUE中下拉列表的option无法添加事件传值的问题

vue.js关于路由的跳转

关于vue中的nextTick深入理解

关于vue子组件的数据变了视图不更新的解决办法(转载)