以下 onClick 回调函数将导致 1 次重新渲染:
const handleClickSync = () => {
// Order of setters doesn't matter - React lumps all state changes together
// The result is one single re-rendering
setValue("two");
setIsCondition(true);
setNumber(2);
};
React 将所有三个状态更改集中在一起并导致 1 次重新渲染。
但是,以下 onClick 回调函数将导致 3 次重新渲染:
const handleClickAsync = () => {
setTimeout(() => {
// Inside of an async function (here: setTimeout) the order of setter functions matters.
setValue("two");
setIsCondition(true);
setNumber(2);
});
};
这是对每个useState
setter 的重新渲染。此外,setter 的顺序会影响每个渲染中的值。
问题:为什么我使函数异步(此处为 via setTimeout
)这一事实会导致状态更改一个接一个地发生,从而导致 3 次重新渲染。如果函数是同步的,只导致一次重新渲染,为什么 React 会将这些状态变化混为一谈?
您可以使用此 CodeSandBox来体验这种行为。