【发布时间】:2021-11-22 20:19:39
【问题描述】:
我一直在摆弄 MobX,并且很难理解为什么以下代码 sn-p 中的 ChildComponent 对状态更新没有反应。
我的理解是ChildComponent 应该更新,因为每次调用controller.updateState() 后isOpen.get() 都会发生变化(这是通过按钮单击促成的)。我添加了一些日志语句,发现状态 确实 正确更新,但 ChildComponent 中的文本没有,我无法弄清楚原因。如果能帮助我理解我在这里做错了什么,我将不胜感激。
注意:我知道从 MobX v6 开始需要调用 makeObservable。但是,我正在处理的代码库使用不支持该函数调用的旧版本。
App.tsx:
import { computed } from "mobx";
import { observer } from "mobx-react";
import { Controller } from "./controller";
const ChildComponent = observer(({ isOpen }: { isOpen: boolean }) => (
<p>isOpen: {isOpen.toString()}</p>
));
export default function App() {
const controller = new Controller();
const isOpen = computed(() => controller.state === "open");
const onClick = () => {
if (isOpen.get()) {
controller.updateState("closed");
} else {
controller.updateState("open");
}
};
return (
<div className="App">
<ChildComponent isOpen={isOpen.get()} />
<button onClick={onClick}>Toggle state</button>
</div>
);
}
controller.ts:
import { action, observable } from "mobx";
type State = "open" | "closed";
export class Controller {
@observable.ref
state: State;
constructor() {
this.state = "open";
}
@action
updateState = (newState: State) => {
this.state = newState;
};
}
codeandbox 链接:https://codesandbox.io/s/broken-pine-3kwpt?file=/src/App.tsx
【问题讨论】:
标签: reactjs typescript mobx