• 小程序的 MobX 绑定辅助库
    • 使用方法
    • 接口
      • behavior 绑定
      • 手工绑定
      • 绑定配置
        • fields
        • actions
      • 延迟更新与立刻更新

    小程序的 MobX 绑定辅助库

    小程序的 MobX 绑定辅助库。

    此 behavior 依赖开发者工具的 npm 构建。具体详情可查阅 官方 npm 文档 。

    可配合 MobX 的小程序构建版 npm 模块 mobx-miniprogram 使用。

    使用方法

    需要小程序基础库版本 >= 2.2.3 的环境。

    也可以直接参考这个代码片段(在微信开发者工具中打开): https://developers.weixin.qq.com/s/36j8NZmC74ac 。

    • 安装 mobx-miniprogrammobx-miniprogram-bindings
    1. npm install --save mobx-miniprogram mobx-miniprogram-bindings
    • 创建 MobX Store。
    1. // store.js
    2. import { observable, action } from 'mobx-miniprogram'
    3. export const store = observable({
    4. // 数据字段
    5. numA: 1,
    6. numB: 2,
    7. // 计算属性
    8. get sum() {
    9. return this.numA + this.numB
    10. },
    11. // actions
    12. update: action(function () {
    13. const sum = this.sum
    14. this.numA = this.numB
    15. this.numB = sum
    16. })
    17. })
    • 在 Component 构造器中使用:
    1. import { storeBindingsBehavior } from 'mobx-miniprogram-bindings'
    2. import { store } from './store'
    3. Component({
    4. behaviors: [storeBindingsBehavior],
    5. data: {
    6. someData: '...'
    7. },
    8. storeBindings: {
    9. store,
    10. fields: {
    11. numA: () => store.numA,
    12. numB: (store) => store.numB,
    13. sum: 'sum'
    14. },
    15. actions: {
    16. buttonTap: 'update'
    17. },
    18. },
    19. methods: {
    20. myMethod() {
    21. this.data.sum // 来自于 MobX store 的字段
    22. }
    23. }
    24. })
    • 在 Page 构造器中使用:
    1. import { createStoreBindings } from 'mobx-miniprogram-bindings'
    2. import { store } from './store'
    3. Page({
    4. data: {
    5. someData: '...'
    6. },
    7. onLoad() {
    8. this.storeBindings = createStoreBindings(this, {
    9. store,
    10. fields: ['numA', 'numB', 'sum'],
    11. actions: ['update'],
    12. })
    13. },
    14. onUnload() {
    15. this.storeBindings.destroyStoreBindings()
    16. },
    17. myMethod() {
    18. this.data.sum // 来自于 MobX store 的字段
    19. }
    20. })

    接口

    将页面、自定义组件和 store 绑定有两种方式: behavior 绑定手工绑定

    behavior 绑定

    behavior 绑定 适用于 Component 构造器。做法:使用 storeBindingsBehavior 这个 behavior 和 storeBindings 定义段。

    注意:你可以用 Component 构造器构造页面, 参考文档 。

    1. import { storeBindingsBehavior } from 'mobx-miniprogram-bindings'
    2. Component({
    3. behaviors: [storeBindingsBehavior],
    4. storeBindings: {
    5. /* 绑定配置(见下文) */
    6. }
    7. })

    手工绑定

    手工绑定 适用于全部场景。做法:使用 createStoreBindings 创建绑定,它会返回一个包含清理函数的对象用于取消绑定。

    注意:在页面 onUnload (自定义组件 detached )时一定要调用清理函数,否则将导致内存泄漏!

    1. import { createStoreBindings } from 'mobx-miniprogram-bindings'
    2. Page({
    3. onLoad() {
    4. this.storeBindings = createStoreBindings(this, {
    5. /* 绑定配置(见下文) */
    6. })
    7. },
    8. onUnload() {
    9. this.storeBindings.destroyStoreBindings()
    10. }
    11. })

    绑定配置

    无论使用哪种绑定方式,都必须提供一个绑定配置对象。这个对象包含的字段如下:

    字段名类型含义
    store一个 MobX observable默认的 MobX store
    fields数组或者对象用于指定需要绑定的 data 字段
    actions数组或者对象用于指定需要映射的 actions

    fields

    fields 有三种形式:

    • 数组形式:指定 data 中哪些字段来源于 store 。例如 ['numA', 'numB', 'sum']
    • 映射形式:指定 data 中哪些字段来源于 store 以及它们在 store 中对应的名字。例如 { a: 'numA', b: 'numB' } ,此时 this.data.a === store.numA this.data.b === store.numB
    • 函数形式:指定 data 中每个字段的计算方法。例如 { a: () => store.numA, b: () => anotherStore.numB } ,此时 this.data.a === store.numA this.data.b === anotherStore.numB

    上述三种形式中,映射形式和函数形式可以在一个配置中同时使用。

    如果仅使用了函数形式,那么 store 字段可以为空,否则 store 字段必填。

    actions

    actions 可以用于将 store 中的一些 actions 放入页面或自定义组件的 this 下,来方便触发一些 actions 。有两种形式:

    • 数组形式:例如 ['update'] ,此时 this.update === store.update
    • 映射形式:例如 { buttonTap: 'update' } ,此时 this.buttonTap === store.update

    只要 actions 不为空,则 store 字段必填。

    延迟更新与立刻更新

    为了提升性能,在 store 中的字段被更新后,并不会立刻同步更新到 this.data 上,而是等到下个 wx.nextTick 调用时才更新。(这样可以显著减少 setData 的调用次数。)

    如果需要立刻更新,可以调用:

    • this.updateStoreBindings() (在 behavior 绑定 中)
    • this.storeBindings.updateStoreBindings() (在 手工绑定 中)