Skip to content

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/flowtrue
deep使用 observable.ref 而不是 observablefalse
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)