2026年5月30日 01:39

MobX 中 observable 怎么用?有哪些注意事项?

MobX 的 observable 用来把普通状态变成“可被追踪的状态”。组件、computed、autorun 或 reaction 读取它时,MobX 会记录依赖;之后状态变化,相关派生值和视图就会自动更新。现在项目里更常用 makeAutoObservablemakeObservable,装饰器写法能见到,但要看团队 Babel/TypeScript 配置。注意:修改状态最好放在 action 里,大对象可用 shallow 降低追踪成本。

追问

makeAutoObservable 和 makeObservable 有什么区别?

makeAutoObservable 会按成员类型自动推断:字段是 observable,getter 是 computed,方法通常是 action。makeObservable 需要手动标注,麻烦一点,但控制更精确,适合复杂 store。

observable 默认是深度追踪吗?

是的,普通对象会递归转成可观察结构。数据很大、嵌套很深,或者只关心引用变化时,可以用 shallow,避免不必要的代理和依赖追踪。

为什么建议在 action 中修改状态?

action 能把多次修改合并成一次事务,减少中间状态暴露,也方便开启 enforceActions 做约束。异步请求完成后修改 observable,常用 runInAction

observable 和 computed 怎么配合?

observable 存原始状态,computed 负责派生结果。比如 todos 是 observable,completedTodos 应该是 computed,而不是每次在组件里重复 filter。

项目里常见坑是什么?

一是解构 observable 后丢失响应式读取场景;二是把 observable 对象直接传给不支持代理的第三方库;三是冻结对象或随意替换深层结构,导致追踪和更新不符合预期。

写段代码

javascript
class TodoStore { todos = [] filter = 'all' constructor() { makeAutoObservable(this) } addTodo(text) { this.todos.push({ text, done: false }) } get doneTodos() { return this.todos.filter(t => t.done) } }
标签:Mobx