微信小程序状态管理的使用

安装:

npm install --save mobx-miniprogram mobx-miniprogram-bindings

创建store.js文件

// 创建 Store 实例对象
import { observable, action } from 'mobx-miniprogram'

export const store = observable({
  // 数据
  numA: 1,
  numB: 2,

  // 计算属性
  get sum () {
    return this.numA + this.numB
  },

  // action 函数,修改store中数据的值
  updateNum1: action(function(step) {
    this.numA += step
  }),
  updateNum2: action(function(step) {
    this.numB += step
  })
})

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

1. 手工绑定:

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

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

import { createStoreBindings } from 'mobx-miniprogram-bindings'
import { store } from '../../store/store'

Page({
  data: {},
  onLoad() {
    this.storeBindings = createStoreBindings(this, {
      store,
      // 将仓库中的数据映射到当前页面this中
      fields: ['numA', 'numB', 'sum'],
      actions: ['updateNum1'],
    })
  },
  onUnload() {
    this.storeBindings.destroyStoreBindings()
  }
})

2. behavior 绑定

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

import { storeBindingsBehavior } from 'mobx-miniprogram-bindings'
import { store } from '../../store/store'

Component({
  behaviors: [storeBindingsBehavior],
  storeBindings: {
    // 数据源
    store,
    fields: {
      numA: 'numA',
      numB: 'numB',
      sum: 'sum'
    },
    actions: {
      updateNum2: 'updateNum2'
    }
  }
})

绑定配置

字段名 类型 含义
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() (在 手工绑定 中)

你可能感兴趣的:(前端学习的知识点,微信小程序,javascript,小程序)