vue中数组或对象在更改后,视图层不渲染

问题及原因

【问题】
在后端接口返回的对象中再添加一个新的属性,但是在添加属性过后。视图层却没有同步更新。
如
data(){
    return{
        demolist:[{name:"Jack",age:15},{name:"Bob",age:12}],
    }
}
methods:{
    demoListDone(){
        this.demolist[0].name="Lucy"    //改变在data中已定义的数据属性name,视图层会渲染
        this.demolist[0].weight="50kg"  //在原有对象上添加新属性weight,视图层不渲染
    }
}

【原因】
Vue 不能检测到对象属性的【添加】或【删除】。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的。
如上,this.demolist[0].name,在页面初始化时,在data对象上是已存在的,所以它是可响应的
而this.demolist[0].weight,在页面初始化时,data对象上并未对其做定义,即没有执行getter/setter 转化过程,所以该属性是不响应的。

解决办法

如上所述,既然我们新添加的属性没有得到vue的getter/setter转化,那么我们可以自己去主动转化我们所添加的新属性。

Vue 不允许在已经创建的实例上动态添加新的根级响应式属性(root-level reactive property)。然而它可以使用 Vue.set(object, key, value) 方法将响应属性添加到嵌套的对象上:
Vue.set(this.demolist[0], 'weight', '50kg')

我们还可以使用 vm.$set 实例方法,这也是全局 Vue.set 方法的别名:
this.$set(this.demolist[0], 'weight', '50kg')

拓展 --- 如果你还不懂,或者想了解更多:

posted @ 2020-01-15 13:24  huihuihero  阅读(1558)  评论(0编辑  收藏  举报