2026年5月30日 01:39

MobX 中 autorun、reaction 和 when 有什么区别?

MobX 里的 reaction 用来处理副作用:状态变了以后,去做日志、请求、持久化、路由跳转这类“不产生派生值”的事。常见有三种:autorun 会立即执行并自动追踪用到的 observable;reaction 把“追踪什么”和“执行什么”分开,更适合精确控制触发条件;when 只在条件第一次满足时执行一次,然后自动清理。面试里要先说清:派生数据用 computed,副作用才用 reaction。

追问

autorun 和 reaction 有什么区别?

autorun 会立即跑一次,函数里读到什么 observable 就追踪什么。reaction 先用 data 函数明确返回要追踪的数据,只有这个数据变化时才执行 effect,适合监听 userIdquery 这类明确字段。

when 适合什么场景?

适合“一次性条件触发”,比如用户登录成功后加载资料、初始化完成后启动订阅。它触发一次后会自动 dispose,不适合长期监听。

reaction 里最容易踩什么坑?

一是忘记清理 disposer,组件卸载后还在监听;二是在 reaction 里修改自己依赖的状态,造成循环触发;三是异步请求回来后没用 runInAction 修改状态。

reaction 和 computed 怎么选?

要返回可缓存的派生值,用 computed;要调用接口、写 localStorage、打印日志、操作外部系统,用 reaction。一个记忆法是:computed 回答“值是什么”,reaction 回答“变化后做什么”。

写段代码

javascript
const dispose = reaction( () => store.query, query => { if (query.length > 2) store.search(query) }, { delay: 300 } ) // React 卸载或不再需要时 // dispose()
标签:Mobx