微信小程序实现数据侦听器,类似vue的watch,替代Observer

背景

既然小程序的组件已经有Observer功能,那为什么还要手写watch功能呢?

  1. Observer只能在Component中使用,没法在Page中使用。若是想在Page中监控某一数据的变化,Observer做不到。
  2. Observer属于小程序的新功能,只能在高版本微信使用,低版本微信无法使用。公司的小程序就因为使用了Observer功能,导致很多低版本微信用户无法使用这个小程序。

实现

新建一个watch.js文件,代码如下

function watch(key, callback) {
  // 先执行一次watch
  callback.call(this, this.data[key])
  let that = this
  let tmpData = this.data[key]
  Object.defineProperty(this.data, key, {
    set: function(value) {
      tmpData = value
      // 值变化了再执行一次
      callback.call(that, value)
    },
    get: function() {
      return tmpData
    }
  })
}
export default watch

原理很简单,就是使用Object.defineProperty来定义要侦听的数据对象,当该值变化时,会执行其中的set方法,我们在set方法中执行侦听器回调就可以了。注:因为组件初始化的时候不会执行set方法,所以需要额外在开始的时候执行一次回调。

这个方法可以在Component的attached、ready函数中或者page的onShow、onLoad函数中使用。

Component中使用watch功能示例如下,Page中用法类似

import watch from '../../utils/watch.js'
Component({
  properties: {
    showPercent: {
      type: Boolean,
      value: true
    },
    percents: Array
  },
  attached: function() {
    watch.call(this, 'percents', function (val) {
      if (val && val.length >0) {
        this.setData({
          showPercent: true
        })
      } else {
        this.setData({
          showPercent: false
        })
      }
    })
  }
})

为了保证watch函数中的this指向,必须使用watch.call(this, ...arguments)的方式调用watch方法。这其中,第一个参数,this,固定写法;第二个参,数要watch的参数名;第三个参数,数值改变后执行的函数。

结语

实现了该watch方法,就可以解决开头说的两个问题了

  1. 在Page中使用侦听器
  2. 兼容低版本微信用户

下一篇《微信小程序实现数据侦听器watch,包含子属性的watch》有方案更高级、使用更简单、且支持子属性watch的实现方法。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Vue 3中,你可以使用`watch`侦听器实现以下功能: 1. 监听数据的变化并执行相应的操作:你可以使用`watch`侦听器来监视数据的变化,一旦数据发生变化,就可以执行相应的操作。例如,你可以监听某个数据变量,并在它发生变化时更新页面上的内容。 ```javascript watch('dataVariable', (newValue, oldValue) => { // 执行操作 }); ``` 2. 异步监听数据的变化:有时候,你需要在数据变化之后执行异步操作,例如发送网络请求或者处理复杂的计算。Vue 3中的`watch`侦听器支持异步函数作为回调函数,你可以在回调函数中执行异步操作。 ```javascript watch('dataVariable', async (newValue, oldValue) => { // 执行异步操作 }); ``` 3. 监听多个数据的变化:你可以在一个`watch`侦听器中同时监听多个数据的变化。当任意一个被监听的数据发生变化时,回调函数都会被触发。 ```javascript watch([ 'dataVariable1', 'dataVariable2' ], (newValues, oldValues) => { // 执行操作 }); ``` 4. 监听组件内部属性的变化:除了监听数据变化外,你还可以使用`watch`侦听器来监听组件内部的属性变化。例如,你可以监听某个组件内部的计算属性,并在其值发生变化时执行操作。 ```javascript watch(() => computedProperty.value, (newValue, oldValue) => { // 执行操作 }); ``` 需要注意的是,在Vue 3中,`watch`侦听器的用法与Vue 2中的`$watch`方法有所不同。你可以在Vue 3的官方文档中查看更多关于`watch`侦听器的详细用法和示例。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值