MobX 自动运行不工作 class 组件构造函数
MobX autorun not working class component constructor
React 真的很难T_T.....
我只想在状态发生变化时调用一个组件方法。我可以使用 Vue 中的 watcher 轻松完成此操作。但是我应该在 React class 组件和 MobX 的自动运行中做什么?这会在功能组件中起作用吗?
import someStore
@observer
class MyComponent {
constructor(){
autorun(
// references someStore.someObservable
// call component methods
// but this isn't hit when there's change
)
}
}
我已经为您制作了 2 个示例,一个带有 class 组件,这不再是推荐的做事方式,另一个带有功能组件。
示例已升级,因为在渲染中计算我们的 status
会容易得多,但我们假设我们不能这样做,我们想调用一些内部方法。
首先,我们设置存储并每秒更新一次:
import { observable, reaction } from 'mobx';
import { observer } from 'mobx-react';
import React, { useEffect, useState } from 'react';
const store = observable({
counter: 0
});
setInterval(() => {
store.counter++;
}, 1000);
// Helper method
const getStatus = (number) => (number % 2 === 0 ? 'even' : 'odd');
这是我们的功能组件,我们使用 useEffect
对计数器变化做出反应,然后使用 setStatus
方法更新我们的内部状态:
const CounterFunctional = observer(() => {
const [status, setStatus] = useState(() => getStatus(store.counter));
useEffect(() => {
setStatus(getStatus(store.counter));
}, [store.counter]);
return <div>functional: {status}</div>;
});
这是我们的 class 组件,现在我们使用 MobX reaction
(不要忘记在卸载时处理它)并在 counter
更改后类似地更新我们的内部状态:
const CounterClass = observer(
class extends React.Component {
disposer;
constructor() {
super();
this.state = {
status: getStatus(store.counter)
};
}
componentDidMount() {
this.disposer = reaction(
() => store.counter,
() => {
this.setState({
status: getStatus(store.counter)
});
}
);
}
componentWillUnmount() {
this.disposer();
}
render() {
return <div>class: {this.state.status}</div>;
}
}
);
希望它有意义,React 实际上是一个超级简单的库 :)
Codesandbox:https://codesandbox.io/s/httpsWhosebugcomquestions66602050-7uhm6
React 真的很难T_T.....
我只想在状态发生变化时调用一个组件方法。我可以使用 Vue 中的 watcher 轻松完成此操作。但是我应该在 React class 组件和 MobX 的自动运行中做什么?这会在功能组件中起作用吗?
import someStore
@observer
class MyComponent {
constructor(){
autorun(
// references someStore.someObservable
// call component methods
// but this isn't hit when there's change
)
}
}
我已经为您制作了 2 个示例,一个带有 class 组件,这不再是推荐的做事方式,另一个带有功能组件。
示例已升级,因为在渲染中计算我们的 status
会容易得多,但我们假设我们不能这样做,我们想调用一些内部方法。
首先,我们设置存储并每秒更新一次:
import { observable, reaction } from 'mobx';
import { observer } from 'mobx-react';
import React, { useEffect, useState } from 'react';
const store = observable({
counter: 0
});
setInterval(() => {
store.counter++;
}, 1000);
// Helper method
const getStatus = (number) => (number % 2 === 0 ? 'even' : 'odd');
这是我们的功能组件,我们使用 useEffect
对计数器变化做出反应,然后使用 setStatus
方法更新我们的内部状态:
const CounterFunctional = observer(() => {
const [status, setStatus] = useState(() => getStatus(store.counter));
useEffect(() => {
setStatus(getStatus(store.counter));
}, [store.counter]);
return <div>functional: {status}</div>;
});
这是我们的 class 组件,现在我们使用 MobX reaction
(不要忘记在卸载时处理它)并在 counter
更改后类似地更新我们的内部状态:
const CounterClass = observer(
class extends React.Component {
disposer;
constructor() {
super();
this.state = {
status: getStatus(store.counter)
};
}
componentDidMount() {
this.disposer = reaction(
() => store.counter,
() => {
this.setState({
status: getStatus(store.counter)
});
}
);
}
componentWillUnmount() {
this.disposer();
}
render() {
return <div>class: {this.state.status}</div>;
}
}
);
希望它有意义,React 实际上是一个超级简单的库 :)
Codesandbox:https://codesandbox.io/s/httpsWhosebugcomquestions66602050-7uhm6