Vue视图不更新问题,响应式对象

由于Vue的更新机制,Vue.js 不能检测到对象属性的增、删。因为 Vue.js 在初始化实例时将属性转为 getter/setter,所以属性必须在 data 对象上才能让 Vue.js 转换它,才能让它是响应的。

出现状况:当你更新对象的值时,对应的值更新了,但是在页面视图层上并没有更新,但当你再更新data里面的某个值时,视图上才随之更新。

 

//部分代码
//在data里面声明一个对象
isOpen: {}
//初始化后以id为键,状态为值形成对象,isOpen的值为
{ 30:false }
//通过点击事件去修改对应id的状态isOpen的值为
{ 30:true }
//更改之后视图上对象isOpen[30]的显示状态并未更新,再随便更新一个data的值后才更新,没有做到响应更新

原因:主要原因就是键没有在data中定义,导致初始化实例时将属性转为 getter/setter ,setter里面无法劫持到对象的这个属性发生变化,进而去发布通知,订阅者们接到通知后更新数据。

有五种解决方案: 
方案一:利用Vue.set(object,key,val)

例:Vue.set(app.obj,'k1','v1')

这个和方法二都是用set更新

方案二:利用this.$set(this.obj,key,val)

this.$set(this.obj,'k1','v1')

this.$set(this.isOpen,companyId,oldValue)

如果上面的set方法不行的话:

方案三:利用Object.assign({},this.obj)创建新对象

例: this.obj.k1='v1'; this.obj = Object.assign({}, this.obj) 或 this.obj = Object.assign({}, this.obj,{'k1','v1'})

change(companyId){

    const oldValue = !this.isOpen[companyId]
    var obj ={}
    obj[companyId] = oldValue
    this.isOpen = Object.assign({}, this.isOpen,obj)

}

方案四:使用…方法,数组或对象(推荐)

例:this.obj = [...this.obj] 或 this.obj = {...this.obj}

this.isOpen = {...this.isOpen}

方案五:使用 this.$forceUpdate() 进行强制更新

this.$forceUpdate();//要刷新的加一句这个就行

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值