当前位置:   article > 正文

微信小程序中实现watch监听机制_js watch 实现只监听初始化一次

js watch 实现只监听初始化一次

自用。

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

1. 定义watch.js

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

  1. // watch.js
  2. const observe = (obj, key, watchFn, deep, page) => {
  3. let oldVal = obj[key]
  4. // 如果监听对象是 object 类型并且指定deep => (深度监听)
  5. if (oldVal !== null && typeof oldVal === 'object' && deep) {
  6. // 递归子集,依次进行 observe
  7. Object.keys(oldVal).forEach(item => {
  8. observe(oldVal, item, watchFn, deep, page)
  9. })
  10. }
  11. // 数据劫持
  12. Object.defineProperty(obj, key, {
  13. configurable: true,
  14. enumerable: true,
  15. set(value) {
  16. if (value === oldVal) return
  17. watchFn.call(page, value, oldVal)
  18. oldVal = value
  19. },
  20. get() {
  21. return oldVal
  22. }
  23. })
  24. }
  25. export const setWatch = page => {
  26. const data = page.data
  27. const watch = page.watch
  28. // 对每一个 watch 中的字段进行 observe
  29. Object.keys(watch).forEach(key => {
  30. let targetData = data
  31. const targetKey = key
  32. // 支持 deep 深度监听, 使用 deep 时需要配合 handler 使用
  33. const watchFn = watch[key].handler || watch[key]
  34. const deep = watch[key].deep
  35. observe(targetData, targetKey, watchFn, deep, page)
  36. })
  37. }

2. 使用

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

  1. // index.js
  2. import { setWatch } from '../../watch.js'
  3. Page({
  4. data: {
  5. foo: ''
  6. },
  7. watch: {
  8. // 需要监听的字段
  9. foo(newValue, oldValue) {
  10. console.log('foo变化了,变化后的值是', val)
  11. ... // 具体操作
  12. }
  13. },
  14. // watch初始化,传入当前页面实例this
  15. onLoad() {
  16. setWatch(this)
  17. }
  18. })

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/1007576
推荐阅读
相关标签
  

闽ICP备14008679号