对于类组件, this.setState
如果在事件处理程序内部调用批处理。但是,如果在事件处理程序之外更新状态并使用 useState
挂钩会发生什么?
function Component() {
const [a, setA] = useState('a');
const [b, setB] = useState('b');
function handleClick() {
Promise.resolve().then(() => {
setA('aa');
setB('bb');
});
}
return <button onClick={handleClick}>{a}-{b}</button>
}
它会立即呈现 aa - bb
吗?或者是 aa - b
然后是 aa - bb
?
原文由 vadirn 发布,翻译遵循 CC BY-SA 4.0 许可协议
TL;DR – 如果状态更改是异步触发的(例如包装在一个 Promise 中),它们将不会被批处理;如果它们被直接触发,它们将被批处理。
我已经设置了一个沙箱来试试这个: https ://codesandbox.io/s/402pn5l989
我制作了两个按钮,一个触发包装在您的代码示例中的承诺中的状态更改,另一个直接触发状态更改。
If you look at the console, when you hit the button “with promise”, it will first show
a aa
andb b
, thena aa
andb bb
.所以答案是否定的,在这种情况下,它不会立即渲染
aa - bb
,每次状态变化都会触发新的渲染,没有批处理。但是,当您单击“无承诺”按钮时,控制台将立即显示
a aa
和b bb
。因此,在这种情况下,React 会批量处理状态更改并同时为两者进行一次渲染。