当前位置:   article > 正文

使用proxy替代setData实现小程序 数据代理_微信小程序属性使用proxy

微信小程序属性使用proxy

小程序 数据代理

微信开发工具导入项目

  新建项目 -> 导入src文件 -> 预览效果
  • 1

代码

proxy.js

  const nativePage = Page
  const nativeComponent = Component
  Page = (options, key = 'onLoad') => {
    const native = options[key]
    options[key] = function () {
      this.ctx = proxy.call(this)
      return native && native.call(this)
    }
    key === 'onLoad' ? nativePage(options) : nativeComponent(options)
  }
  Component = options => Page(options, 'created')

  function proxy() {
    let pending = false
    const setData = () => {
      pending = true
      setTimeout(() => {
        this.setData(this.data, () => pending = false)
      })
    }

    const handler = {
      get(target, key, receiver) {
        try {
          if (typeof target[key] === 'function') return Reflect.get(target, key, receiver)
          return new Proxy(target[key], handler)
        } catch (err) {
          return Reflect.get(target, key, receiver)
        }
      },
      set(target, key, value, receiver) {
        if (!(Array.isArray(target) && key !== 'length')) !pending && setData()
        return Reflect.set(target, key, value, receiver)
      },
      deleteProperty(target, key) {
        !pending && setData()
        return Reflect.deleteProperty(target, key)
      }
    }
    return new Proxy(this.data, handler)
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
### 使用 > 在 app.js 中引入 proxy.js 文件
  require('./vendor/proxy.js')
  • 1

在 index 页面中的 index.js 中使用

  onLoad: function () {
    this.ctx.motto = 'Hello Echo'
    this.ctx.user.name = 'Echo'
  }
  • 1
  • 2
  • 3
  • 4

在 movable 组件中的 movable.js 中使用

  created: function () {
    this.ctx.visible = true
  }
  • 1
  • 2
  • 3
截图预览 > 数据更新前 和 更新后 对比

原理说明

  • 拦截数据变化,调用 this.setData 方法
  • 多条数据变化,合并一次更新
  • 代理对象绑定到 this.ctx 上下文中,同步更新 this.data 数据

链接地址

github: 使用proxy替代setData实现小程序 数据代理

小程序: 使用proxy替代setData实现小程序 数据代理

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

闽ICP备14008679号