在uni-app中,如果data中的对象属性改变了,但是页面没有相应更新的情况,通常有以下几点需要注意:

1. 使用this.$set更新对象属性直接修改对象属性是无法触发页面更新的,需要使用this.$set方法:

this.$set(this.obj, 'key', value)

2. 确保数据层级不太深如果对象层级过深,改变内层属性也可能无法触发更新。建议关键数据不要超过2层。

3. 使用深度 watcher可以在watch中用深度watcher的方式监听整个对象的变化:

watch: {
  obj: {
    handler(newVal) {
      // 对象改变响应逻辑
    },
    deep: true
  } 
}

4. 使用计算属性有些场景可以通过计算属性来响应对象属性变化。

5. 检查是否多次修改同一属性连续多次修改同一属性不会触发多次更新。

注意:

比较推荐的做法是:

  1.  默认使用 this.$set 更新对象属性this.$set 是 uni-app 提供的接口,可以显式触发属性改变的响应。使用简单,也相对直观,所以在大多数场景下都是比较好的选择。
  2.  对于层级较深的对象,可以配合深度 watcher 使用如果数据层级很深,只使用 this.$set 可能仍然无法触发更新,这时候可以额外使用 deep watcher 来完整监听对象变化。
  3. 根据需要使用计算属性计算属性可以将依赖的对象属性转换为一个响应式的计算值,在某些场景下可以简化逻辑。
  4.  尽量保持数据层级不要太深这是从根本上减少响应问题的方法。业务数据层级不要超过 3 层。

所以,综合来说: 

  • 默认使用 this.$set 更新对象属性
  • 配合深度 watcher 监听深层级对象变化
  • 根据实际需求适当使用计算属性
  • 保持数据尽量扁平这样可以比较全面地处理对象属性更新页面不响应的问题

eg:

1、使用this.$set更新对象属性

this.$set(this.itemData, 'likeNum', result.length)

2、在watch中用深度watcher的方式

					js
					// data中定义对象
					data() {
					  return {
						user: {
						  name: 'John',
						  age: 20
						}
					  }
					}
					
					// 深度watch监听对象所有属性变化
					watch: {
					  user: {
						handler(val, oldVal) {
						  // 对象被改变时响应
						},
						deep: true
					  }
					}
					
					// 后续修改对象属性都会触发handler函数
					this.user.name = 'Tom' 
					this.user.age = 22

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值