1. 前言
从vuex到 redux ,react-redux , pinia, 最后的Mobx全部都得搞;
还好都不难,我的头发也是非常茂盛
2. 安装
- npm install --save mobx-miniprogram mobx-miniprogram-bindings
- 具体参考小程序安装依赖
- 注意删除 miniprogram_npm 重新构建
3. 创建 仓库/store
- 这步 其实所有的状态管理都差不多
- 这个我是在项目根目录创建了 相关文件
/store/store.js
- 核心代码
//这个js文件个 中,专门来创建 store实例对象
import {
action,
observable
} from "mobx-miniprogram";
export const store = observable({
// 数据字段 直接写
numA: 666,
numB: 999,
//计算属性
get sum() {
return this.numA + this.numB
},
/// actions 使用箭头函数 出this问题
updateNumA: action(function(n) {
this.numA += n
}),
updateNumB: action(function (step) {
this.numB += step
})
})
observable
- 按需导入
observable
看名字就知道是用来监测
的,是个函数
- 参数是个对象 ,需要全局共享的状态/数据 ,直接写:赋初值就
行
action
- 按需导入
action
看名字就知道是动作,也就对应着我们相关的修改函数- 语法是 键:action(函数),函数的参数就是使用的时候传递过来的参数
- 注意这个函数不要使用箭头函数 会有
this
的问题
计算属性
- 直接就是写函数就行 ,不要忘记return.依赖于上面写的共享状态
4. 页面绑定 store
- 按需导入
- 挂载数据
- 离开页面清理
// pages/baseMobx/baseMobx.js
// 1. 按需导入
import { createStoreBindings } from "mobx-miniprogram-bindings";
import {store} from "../../store/store"
Page({
// 页面加载
onLoad(){
//2. 挂载
this.storeBindings = createStoreBindings(this,{
store,// store 对象
fields:["numA",'numB',"sum"],// 需要的字段
actions:["updateNumA","updateNumB"]
})
},
// 页面卸载
onUnload(){
this.storeBindings.destroyStoreBindings()
},
// *****************页面调用的方法好 直接写
changeNumA(e){
// 调用的 store的 action
this.updateNumA(e.target.dataset.n)
},
changeNumB(e){
this.updateNumB(e.target.dataset.step)
}
})
- 导入 自己封装的 store
- 共享状态: 在
onLoad
里面创建 strore绑定,挂载 fields 需要的状态,按需挂载- 修改函数:actions,映射/绑定需要的修改函数
5. 页面使用
- 事件绑定
<button type="primary" size="mini" bindtap="changeNumA" data-n="{{10}}">{{numA}}</button>
- 就调用了 js里面的
changeNumA
事件
6. 组件绑定 store
- 组件和页面使用 store 有些许不同,因为在小程序里面组件和页面本身的构成有区别
- 组件要想使用 store必须借用 小程序的
behaviors
(这个不会的回头再开篇文章就明白了,其实简单来说类似 vue的 mixin/混入)- 核心代码
// components/comMobx/comMobx.js
//********************* 1 导入
import {storeBindingsBehavior} from "mobx-miniprogram-bindings"
import {store} from "../../store/store"
Component({
//********************* 2 通过 behaviors,storeBindingsBehavior来实现自动绑定
behaviors:[storeBindingsBehavior],
//********************* 3 类似组件创建 store
storeBindings:{
store,//指定绑定的 store
//********************* 4 共享状态
fields:{
// 类似vuex
numA:()=>store.numA,// 绑定字段方式---1
numB:(store)=>store.numB,// 绑定字段方式---2
sum:"sum",// 绑定字段方式---3 可以重命名
},
//********************* 5 修改函数
actions:{
updateNumA:'updateNumA',
updateNum2:"updateNumB",//重命名
}
},
// 组件的 方法必须写到 methods 里面
methods:{
//******************* 6 使用组件调用的 方法
changeNumA(e){
// 调用的是 store的 action
this.updateNumA(e.target.dataset.n)
},
changeNumB(e){
this.updateNum2(e.target.dataset.step)
}
}
})
7. 组件使用 store
- 核心代码
<view class="box">
<button type="primary" size="mini" bindtap="changeNumA" data-n="{{10}}">{{numA}}</button>
+
<button type="primary" size="mini" bindtap="changeNumB" data-step="{{1}}">{{numB}}</button> =
<button size="mini">{{sum}}</button>
</view>