我有一些类似的代码:
const [thing, setThing] = useState('');
const [value, setValue] = useState({
thing: '',
somethingElse: '',
});
//...
setThing(aThing);
setValue((prev) => ({ ...prev, thing: aThing }));
在后面的代码中,我可以保证thing==value。东西
?或者这两个useState设置程序可能在不同的时间调用?
setState是异步函数,如果不批处理更新,则第一个setState可能在第二个语句之前完成。
如果从基于React的事件(如按钮单击或输入更改)中触发,React当前将批处理状态更新。如果在React事件处理程序(如setTimeout())外部触发更新,则不会对其进行批处理。
setState()并不总是立即更新组件。它可以批处理更新或将更新推迟到以后。这使得阅读成为可能。调用setState()后立即声明可能存在的陷阱。相反,使用componentDidUpdate或setState回调(setState(updater,callback)),这两种回调都保证在应用更新后触发。如果需要基于上一个状态设置状态,请阅读下面的updater参数。
这种形式的setState()也是异步的,同一周期内的多个调用可能会被批处理在一起。例如,如果您试图在同一周期中多次增加物品数量,将导致以下等效结果:
Object.assign(
previousState,
{quantity: state.quantity + 1},
{quantity: state.quantity + 1},
...
)
后续调用将覆盖同一周期中先前调用的值,因此数量只会增加一次。如果下一个状态取决于当前状态,我们建议使用updater函数形式,而不是:
this.setState((state) => {
return {quantity: state.quantity + 1};
});
你可以在这里阅读更多关于反应官方文档的状态。