关于小程序使用watch监听数据变化的方法

众所周知,Vue中,可以使用监听属性 watch来观察和响应 Vue 实例上的数据变化,那么小程序能不能实现这一点呢?

监听器的原理,是将data中需监听的数据写在watch对象中,并给其提供一个方法,当被监听的数据的值改变时,调用该方法。​​

我们需要用到Javascript中的Object.defineProperty()方法,来手动劫持对象的getter/setter,从而实现给对象赋值时(调用setter),执行watch对象中相对应的函数,达到监听效果。

Object.defineProperty()方法,会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。

 

这里假定有多个页面需要监听需求,把监听方法写在app.js中,以便全局调用

onLaunch: function () {},
// 设置监听器
watch: function (ctx, obj) {
  Object.keys(obj).forEach(key => {
    this.observer(ctx.data, key, ctx.data[key], function (value) {
      obj[key].call(ctx, value)
    })
  })
},
// 监听属性,并执行监听函数
observer: function (data, key, val, fn) {
  Object.defineProperty(data, key, {
    configurable: true,
    enumerable: true,
    get: function () {
      return val
    },
    set: function (newVal) {
      if (newVal === val) return
      fn && fn(newVal)
      val = newVal
    },
  })
}

 

然后,在需要监听的页面onLoad中,调用watch方法(其中test是要监听的数据,当test在其他方法中通过this.setData赋值后,watch就能监听到test的变化了)

const app = getApp()
Page({
  data: {
    test: 0
  },
  onLoad: function () {
    // 调用监听器,监听数据变化
    app.watch(this, {
      test: function (newVal) {
        console.log(newVal)
      }
    })
  }    

 

转载于:https://www.cnblogs.com/jane2160/p/11551286.html

### uniapp 微信小程序中 `watch` 深度监听数据变化不生效的原因分析 在uniapp开发微信小程序的过程中,如果遇到`watch`深度监听数据变化不生效的情况,这通常是因为默认情况下`watch`仅会监控对象顶层属性的变化。当对象内部嵌套层次较深或者新添加的属性未被正确追踪时,可能会导致监听失效[^2]。 对于这种情况,可以采取以下几种解决方案: #### 方案一:设置deep选项为true 通过配置`watch`中的`deep`参数为`true`,可以让其能够检测到对象内部深层次的数据变动。需要注意的是,在某些版本的小程序框架里,即使设置了`deep:true`也未必能完全解决问题,特别是针对动态增加的新属性[^3]。 ```javascript export default { data() { return { goodlist: { no:'123', name:'mytv', price:25 } }; }, watch: { 'goodlist': { handler(newValue, oldValue){ console.log('data changed'); }, deep: true, immediate: false // 是否立即执行handler函数,默认false } } } ``` #### 方案二:使用Vuex管理状态并配合actions/mutations更新 采用集中式的状态管理模式(如Vuex),并通过定义好的action或mutation方法来进行数据修改操作。这样做的好处是可以更精确地控制何时以及如何改变应用的状态,并且更容易实现复杂逻辑下的响应机制。 #### 方案三:手动触发视图刷新 有时为了确保页面及时反映出最新的数据情况,可以在适当的地方调用强制渲染的方法,例如`this.$forceUpdate()`。不过这种方法应谨慎使用,因为它可能导致不必要的性能开销。 #### 方案四:利用computed计算属性辅助监测 创建依赖于目标变量的计算属性,一旦这些基础变量发生变化,则自动重新评估该表达式的结果,进而间接达到监视的效果。这种方式适用于那些可以通过简单运算得出结论的情形。 ### 注意事项 - 当处理较为复杂的业务场景时,建议优先考虑优化模型设计结构,减少深层级的对象嵌套。 - 对于频繁发生变更的数据集,应当权衡不同策略之间的利弊得失,选取最适合当前项目的方案。 - 如果仍然无法解决问题,可能需要查看官方文档是否有新的API支持或是社区内是否存在相似案例可供借鉴[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值