微信小程序 watch 监听

发布于 2024-05-02 15:30:41 字数 1812 浏览 27 评论 0

1、新建 watch.js

const observe = (obj, key, watchFun, deep, page) => {
    let oldVal = obj[key]
    // 如果监听对象是 object 类型并且指定 deep(深度监听)
    if (oldVal !== null && typeof oldVal === 'object' && deep) {
      // 递归子集,依次执行 observe()
      Object.keys(oldVal).forEach(item => {
        observe(oldVal, item, watchFun, deep, page)
      })
    }
    // 使用 Object.defineProperty() 劫持数据的写操作,在监听对象改变后执行传入的 watchFun
    Object.defineProperty(obj, key, {
      configurable: true,
      enumerable: true,
      set(value) {
        if (value === oldVal) return
        watchFun.call(page, value, oldVal)
        oldVal = value
      },
      get() {
        return oldVal
      }
    })
  }
  
  export const setWatcher = (page) => {
    // 页面里的 data 字段
    const data = page.data
    // 页面里的 watch 字段
    const watch = page.watch
    // 对 watch 里列举的每一个字段(需要监听的字段)执行 observe()
    Object.keys(watch).forEach(key => {
      let targetData = data
      const targetKey = key
      // 支持 deep 深度监听,使用 deep 时需要配合 handler 使用,否则直接编写函数
      const watchFun = watch[key].handler || watch[key]
      const deep = watch[key].deep
      observe(targetData, targetKey, watchFun, deep, page)
    })
  }

2、引入使用

在需要使用监听机制页面的 js 文件的 onLoad 钩子里,执行 setWatcher ,并传入当前页面实例 this ,完成初始化。

添加 watch 对象,内部写入需要被监听的字段以及执行函数:

// test.js

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

大姐,你呐

暂无简介

文章
评论
29 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文