• 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')
    

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

  • 相关阅读:
    小程序与VUE请求后台接口,传数组
    VUE中使用Echarts图表
    封装一个VUE时间线组件
    Git的使用方法及IDEA与Git的集成(二)
    Git中拥有不同的仓库的不同账户
    IDEA无法集成Git问题
    IDEA之debug学习
    MyBatis 学习(三)
    MyBatis 学习(二)
    MyBatis 学习(一)
  • 原文地址:https://www.cnblogs.com/huihuihero/p/12196166.html
Copyright © 2020-2023  润新知