• Stars
    star
    175
  • Rank 217,168 (Top 5 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created about 5 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

小程序的 MobX 绑定辅助库

小程序的 MobX 绑定辅助库

小程序的 MobX 绑定辅助库。

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

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

使用方法

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

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

  1. 安装 mobx-miniprogrammobx-miniprogram-bindings
npm install --save mobx-miniprogram mobx-miniprogram-bindings
  1. 创建 MobX Store。
// store.js
import { observable, action } from "mobx-miniprogram";

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

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

  // actions
  update: action(function () {
    const sum = this.sum;
    this.numA = this.numB;
    this.numB = sum;
  }),
});
  1. 在 Component 构造器中使用:
import { storeBindingsBehavior } from "mobx-miniprogram-bindings";
import { store } from "./store";

Component({
  behaviors: [storeBindingsBehavior],
  data: {
    someData: "...",
  },
  storeBindings: {
    store,
    fields: {
      numA: () => store.numA,
      numB: (store) => store.numB,
      sum: "sum",
    },
    actions: {
      buttonTap: "update",
    },
  },
  methods: {
    myMethod() {
      this.data.sum; // 来自于 MobX store 的字段
    },
  },
});
  1. 在 Page 构造器中使用:

如果小程序基础库版本在 2.9.2 以上,可以直接像上面 Component 构造器那样引入 behaviors 。

如果需要比较好的兼容性,可以使用下面这种方式(或者直接改用 Component 构造器来创建页面)。

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

Page({
  data: {
    someData: "...",
  },
  onLoad() {
    this.storeBindings = createStoreBindings(this, {
      store,
      fields: ["numA", "numB", "sum"],
      actions: ["update"],
    });
  },
  onUnload() {
    this.storeBindings.destroyStoreBindings();
  },
  myMethod() {
    this.data.sum; // 来自于 MobX store 的字段
  },
});

Typescript 支持

2.1.2 版本开始提供了简单的 TypeScript 支持。

新增两个构造器 API,推荐优先使用下列新版接口,你也可以继续使用旧版接口,详见接口说明。

ComponentWithStore

import { ComponentWithStore } from "mobx-miniprogram-binding";
ComponentWithStore({
  options: {
    styleIsolation: "shared",
  },
  data: {
    someData: "...",
  },
  storeBindings: {
    store,
    fields: ["numA", "numB", "sum"],
    actions: {
      buttonTap: "update",
    },
  },
});

BehaviorWithStore

import { BehaviorWithStore } from "mobx-miniprogram-binding";
export const testBehavior = BehaviorWithStore({
  storeBindings: {
    store,
    fields: ["numA", "numB", "sum"],
    actions: ["update"],
  },
});

接口

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

behavior 绑定

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

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

import { storeBindingsBehavior } from "mobx-miniprogram-bindings";
Component({
  behaviors: [storeBindingsBehavior],
  storeBindings: {
    /* 绑定配置(见下文) */
  },
});

也可以把 storeBindings 设置为一个数组,这样可以同时绑定多个 store

import { storeBindingsBehavior } from "mobx-miniprogram-bindings";
Component({
  behaviors: [storeBindingsBehavior],
  storeBindings: [
    {
      /* 绑定配置 1 */
    },
    {
      /* 绑定配置 2 */
    },
  ],
});

手工绑定

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

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

import { createStoreBindings } from "mobx-miniprogram-bindings";

Page({
  onLoad() {
    this.storeBindings = createStoreBindings(this, {
      /* 绑定配置(见下文) */
    });
  },
  onUnload() {
    this.storeBindings.destroyStoreBindings();
  },
});

绑定配置

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

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

与 miniprogram-computed 一起使用

miniprogram-computed 时,在 behaviors 列表中 computedBehavior 必须在后面:

Component({
  behaviors: [storeBindingsBehavior, computedBehavior],
  /* ... */
});

关于部分更新

如果只是更新对象中的一部分(子字段),是不会引发界面变化的!例如:

Component({
  behaviors: [storeBindingsBehavior],
  storeBindings: {
    store,
    fields: ["someObject"],
  },
});

如果尝试在 store 中:

this.someObject.someField = "xxx";

这样是不会触发界面更新的。请考虑改成:

this.someObject = Object.assign({}, this.someObject, { someField: "xxx" });

More Repositories

1

miniprogram-demo

微信小程序组件 / API / 云开发示例
JavaScript
6,576
star
2

minigame-unity-webgl-transform

Wechat Mini Game Unity engine adapter documents.
C
2,856
star
3

weui-miniprogram

小程序WeUI组件库
TypeScript
2,070
star
4

threejs-miniprogram

WeChat MiniProgram adapted version of Three.js
JavaScript
692
star
5

api-typings

Type definitions for APIs of Wechat Mini Program in TypeScript
TypeScript
673
star
6

computed

小程序自定义组件 computed / watch 扩展
TypeScript
654
star
7

recycle-view

recycle-view: a wechat miniprogram custom component
JavaScript
620
star
8

miniprogram-simulate

小程序自定义组件测试工具集
JavaScript
487
star
9

kbone-ui

kbone-ui 是一套能同时支持 小程序(kbone) 和 vue 框架开发的多端 UI 库(PS:新版 kbone-ui 已出炉并迁移到 kbone 主仓库,此仓库仅做旧版维护之用)
Vue
439
star
10

sm-crypto

miniprogram sm crypto library
JavaScript
414
star
11

kbone-template-vue

a simple vue template for kbone
JavaScript
350
star
12

lottie-miniprogram

lottie for miniprogram
JavaScript
337
star
13

minigame-canvas-engine

轻量级canvas2d渲染引擎,开放数据域开发解决方案。
JavaScript
263
star
14

miniprogram-component-plus

JavaScript
253
star
15

miniprogram-custom-component

JavaScript
197
star
16

slide-view

weapp custom component -- slide-view
JavaScript
185
star
17

glass-easel

Multiple-backend declarative component-based JavaScript framework
TypeScript
172
star
18

minigame-demo

微信小游戏组件 / API / 云开发示例
JavaScript
150
star
19

navigation-bar

weapp custom component -- navigation-bar
JavaScript
148
star
20

wxml-to-canvas

JavaScript
146
star
21

kbone-template-react

a simple react template for kbone
JavaScript
134
star
22

minigame-adaptor

C#
131
star
23

miniprogram-i18n

小程序国际化方案 / The internationalizational (i18n) library for wechat miniprogram
TypeScript
129
star
24

miniprogram-slim

JavaScript
123
star
25

h5-to-miniprogram

a simple tool for transforming h5 to miniprogam
JavaScript
113
star
26

minigame-api-typings

Type definitions for APIs of Wechat Mini Game in TypeScript
TypeScript
106
star
27

minigame-lockstep-demo

JavaScript
102
star
28

awesome-skyline

94
star
29

kbone-api

TypeScript
73
star
30

skylint

Skyline 小程序迁移工具. Migration assistant for Skyline miniapp.
TypeScript
69
star
31

miniprogram-cli

JavaScript
68
star
32

miniprogram-compat

微信小程序 js 执行环境的兼容信息
JavaScript
66
star
33

mpflow

TypeScript
61
star
34

miniprogram-api-promise

JavaScript
59
star
35

miniprogram-file-uploader

JavaScript
57
star
36

xr-frame-cli

Tools for xr-frame in wechat miniprogram.
TypeScript
50
star
37

kbone-template-kboneui

JavaScript
43
star
38

j-component

a mock minprogram component framework
JavaScript
43
star
39

miniprogram-gesture

微信小程序手势库
JavaScript
39
star
40

h5-to-miniprogram-demo

一个简单的使用 h5-to-miniprogram 工具进行 h5 页面转换成小程序的 demo
JavaScript
31
star
41

miniprogram-elder-transform

小程序适老化自动适配工具
TypeScript
31
star
42

miniprogram-barrage

JavaScript
23
star
43

minigame-tuanjie-transform-sdk

JavaScript
22
star
44

miniprogram-hooks

小程序自定义组件 hooks
JavaScript
20
star
45

miniprogram-cloudbase-meeting-demo

云开发直播运营活动 demo
JavaScript
17
star
46

kbone-template-preact

a simple preact template for kbone
JavaScript
12
star
47

miniprogram-game-quickstart

JavaScript
12
star
48

wechat-miniprogram.github.io

HTML
11
star
49

miniprogram-quickstart

JavaScript
10
star
50

gtktest

Flutter linux demo with webview.
C++
9
star
51

miniprogram-offline-demo

小程序弱网/离线 demo
JavaScript
9
star
52

miniprogram-data-panel

小程序数据面板组件
JavaScript
6
star
53

xnet-miniprogram

Python
6
star
54

router

JavaScript
4
star
55

babel-preset-miniprogram

微信小程序 babel 构建环境预设
JavaScript
2
star
56

minigame-playable

TypeScript
2
star
57

miniprogram-mock

mock api for miniprogram
JavaScript
1
star
58

mp-user-avatar

TypeScript
1
star