微信小程序中实现watch监听机制

自用。

使用Object.defineProperty()劫持数据的set操作,在监听对象改变后执行传入的Fn。

1. 定义watch.js

在根目录(miniprogram)下创建watch.js

// watch.js

const observe = (obj, key, watchFn, deep, page) => {
  let oldVal = obj[key]
  // 如果监听对象是 object 类型并且指定deep  => (深度监听)
  if (oldVal !== null && typeof oldVal === 'object' && deep) {
    // 递归子集,依次进行 observe
    Object.keys(oldVal).forEach(item => {
      observe(oldVal, item, watchFn, deep, page)
    })
  }
  // 数据劫持
  Object.defineProperty(obj, key, {
    configurable: true,
    enumerable: true,
    set(value) {
      if (value === oldVal) return
      watchFn.call(page, value, oldVal)
      oldVal = value
    },
    get() {
      return oldVal
    }
  })
}

export const setWatch = page => {
  const data = page.data
  const watch = page.watch
  // 对每一个 watch 中的字段进行 observe
  Object.keys(watch).forEach(key => {
    let targetData = data
    const targetKey = key
    // 支持 deep 深度监听, 使用 deep 时需要配合 handler 使用
    const watchFn = watch[key].handler || watch[key]
    const deep = watch[key].deep
    observe(targetData, targetKey, watchFn, deep, page)
  })
}

2. 使用

在需要使用监听机制页面的js文件(如index.js)onLoad钩子里,执行setWatch(使用import关键词从watch.js引入),并传入当前页面实例this,完成初始化。

// index.js

import { setWatch } from '../../watch.js'

Page({
  data: { 
    foo: ''
  },
  watch: {
    // 需要监听的字段
    foo(newValue, oldValue) {
      console.log('foo变化了,变化后的值是', val)
      ... // 具体操作
    }
  },
  // watch初始化,传入当前页面实例this
  onLoad() {
    setWatch(this)
  }
})

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值