You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MobX Observer组件未响应Observable状态变更问题求助

问题根源

  • 你的App是普通React组件,没有被observer修饰,MobX 不会跟踪普通组件内读取的observable/ computed值变化,也就不会触发App组件重渲染。你首次渲染时调用isOpen.get()拿到初始值传给ChildComponent后,后续状态更新时App不会重新执行渲染逻辑,传给Child的prop永远是初始值,因此Child不会更新。
  • 另外你传给ChildComponent的是isOpen.get()返回的原始布尔值,不是observable引用,即便Child是observer组件,也无法跟踪这个普通值的后续变化。

修复方案(二选一即可)

方案1:给App组件加上observer修饰

让App组件可以响应observable变化触发重渲染,每次状态更新都会重新计算isOpen.get()把最新值传给Child:

// App.tsx 修改导出部分
export default observer(function App() {
  // 原有逻辑保持不变
})

方案2:传递computed对象本身到Child内部读取

把computed引用传给Child,在observer修饰的Child内部执行.get(),由Child自己跟踪状态变化触发重渲染,不需要App更新:

// App.tsx 中调用Child的部分修改
<ChildComponent isOpen={isOpen} />

// ChildComponent 修改
const ChildComponent = observer(({ isOpen }: { isOpen: ComputedValue<boolean> }) => (
  <p>isOpen: {isOpen.get().toString()}</p>
));

额外优化建议

你Controller里的state是字符串基础类型,不需要使用@observable.ref,直接用@observable修饰即可,@observable.ref仅用于不需要深度监听的对象/引用类型值。

内容的提问来源于stack exchange,提问作者nugget_boi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:36:03