美文网首页
关于Vue中的属性值无法与视图同步的问题

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

作者: sxh不是帅小伙 | 来源:发表于2019-08-14 23:49 被阅读0次

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

<template>
    <div>
        <p @click="addValueA(obj)"> {{obj['valueA']}} </p>
        <p @click="addValueB(obj)"> {{obj['valueB']}} </p>
    </div>
</template>
<script>
    export default {
        data(){
            return {
                obj: {valueA: 0},
            }
        },
        created() {
            this.obj['valueB'] = 0;
            console.log(this.obj);
        },
        methods: {
            addValueA(obj) {
                obj.valueA = obj.valueA + 1;
                console.log('valueA--' + obj.valueA);
            },
            addValueB(obj) {
                obj.valueB = obj.valueB + 1;
                console.log('valueB--' + obj.valueB );
            }
        }
    }
</script>

<style scoped>

</style>

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

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



同时页面上的显示情况:



我们继续触发三次增加ValueB的函数,网页打印结果如下:

同时页面上的显示情况:

由此看出,更新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)
上述实例解决如下:

//将created()钩子函数修改如下
created() {
            this.$set(this.obj,'valueB',0);
            console.log(this.obj);
        },
重新运行可以看出ValueA和ValueB都有了get与set方法

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



相关文章

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

    在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对...

  • 数据劫持

    数据驱动视图: 新的问题:无法对新增的属性进行监听 在下面重新监听新的值 特别优待的数组(vue对数组的方法进行了...

  • vue 官方教程文档笔记

    1.Vue视图数据响应式更新 注释:1。 data中所有的值都挂在vm实例中,当修改vm 实例中的属性值时data...

  • Vue源码解析之数组变异的实现

    众所周知,在 Vue 中,直接修改对象属性的值无法触发响应式。当你直接修改了对象属性的值,你会发现,只有数据改了,...

  • Vue源码解析之数组变异的实现

    力有不逮的对象众所周知,在 Vue 中,直接修改对象属性的值无法触发响应式。当你直接修改了对象属性的值,你会发现,...

  • vue面试题

    1. vue实现双向绑定的原理? MVVM 模式在于数据与视图的保持同步,意思是说数据改变时会自动更新视图,视图发...

  • Vue.js基础入门之属性绑定

    Vue实例中的属性与html的绑定 使用:1.插值写法 2.属性绑定 3.双向绑定

  • vue实例与api

    vue实例 数据与方法 当实例被创建时,data对象中所有属性都加入到vue响应式系统中,当属性的值发生改变时,视...

  • 数组变异方法(vue: ^2.0)

    Object.defineProperty 监听拦截中存在的一些问题 @:Vue框架中监听数组属性值的变化 Obj...

  • Vue实例中的属性,Vue新定义的标签

    VUE中可以存放的属性 vue自带的标签 //动态的根据data值...

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/cgeojctx.html