【发布时间】:2021-12-19 15:23:01
【问题描述】:
下面这个 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 的顺序会影响每个渲染中的值。
问题:为什么我将函数设为异步(此处通过setTimeout)会导致状态更改一个接一个地发生,从而导致 3 次重新渲染。如果函数是同步的,为什么 React 会将这些状态变化混为一谈,只导致一次重新渲染?
您可以使用this CodeSandBox 来体验该行为。
【问题讨论】:
-
因为你不在 react 自己的调用范围内。首先,react 将调用 click 处理程序,并且 setstate 调用将在它结束时完成。在第二种情况下,它发生在任意时间,因此反应不会对其进行批处理。阅读blog.isquaredsoftware.com/2020/05/… - 或者更确切地说,阅读整篇文章。我认为这是任何使用 react 的人都应该阅读的内容的一部分。
-
虽然没有解释原因,但React documentation suggests “根据哪些值往往会一起变化,将状态[拆分] 为多个状态变量。” 这意味着无论何时可能,如果大多数值一起更改,则使用对象作为状态就可以了。
标签: javascript reactjs react-hooks