Mobx
最佳实践:class
+ makeAutoObservable
ts
class DemoStore {
/** state */
counter = 0;
constructor() {
makeAutoObservable(this);
}
/** action */
increase() {
this.counter += 1;
}
/** computed */
get counterPlusOne() {
return this.counter + 1;
}
}
术语表
术语 | 含义 |
---|---|
state | 状态 |
action | 修改 state 的函数 |
derivation | 包括三种:computed、带参数的 "computed"、reaction |
computed | 依赖 state 的 get 属性 |
带参数的 "computed" | 依赖 state、带参数、返回值的函数,不能标记为 computed |
reaction | 依赖 state、不返回值的副作用函数 |
derivation | 依赖 state | 带参数 | 返回值 |
---|---|---|---|
computed | ✅ | ❌ | ✅ |
带参数的 "computed" | ✅ | ✅ | ✅ |
reaction | ✅ | ❔ | ❌ |
makeAutoObservable
makeAutoObservable(target, overrides?, options?)
推导规则:
- 自由属性:observable
- get 属性:computed
- set 属性:action
- 方法:autoAction
- 迭代器:flow
overrides
标记 | 含义 |
---|---|
false | 不转换为响应式,主要用于 makeAutoObservable |
autoAction | 运行时根据调用上下文决定是 action 还是 derivation |
options
选项 | 含义 | 默认值 |
---|---|---|
autoBind | 使用 action.bound /flow.bound 而不是 action /flow | true |
deep | 使用 observable.ref 而不是 observable | false |
name | 调试用的名称 |
makeObservable
makeObservable(target, annotations?, options?)
state
标记 | 含义 |
---|---|
observable 等价于 observable.deep | 深响应 |
observable.ref | 只有重新赋值会响应 |
observable.shallow | 浅响应 (只有一层) |
observable.struct | 只有值不同才会响应 |
action
标记 | 含义 |
---|---|
action | 修改 state 的方法 |
action.bound | 绑定 this 为当前实例 |
computed
标记 | 含义 |
---|---|
computed | 依赖 state 的 get 访问器属性 |
computed.struct | 只有值不同才会响应 |
flow
标记 | 含义 |
---|---|
flow | 用于管理异步进程 |
flow.bound | 绑定 this 为当前实例 |
其他
标记 | 含义 |
---|---|
true | 自动推导,相当于 makeAutoObservable |
false | 不转换为响应式,主要用于 makeAutoObservable |
override | 重写父类 action/computed |
autoAction | 运行时根据调用上下文决定是 action 还是 derivation |
observable -> vanilla
- 浅转换:浅拷贝
{ ...observableObject }
observableArray.slice()
new Map(observableMap)
- 深转换:
toJS(observableObject/Array/Map)