在 Dan Abramov 在 SO 上的这个回答中,我发现了以下内容:
目前(React 16 和更早版本),默认情况下,仅对 React 事件处理程序内的更新进行批处理。有一个不稳定的 API 可以在您需要的极少数情况下强制在事件处理程序之外进行批处理。
他还在这个 Github issue 中提到:
https://github.com/facebook/react/issues/10231#issuecomment-316644950
在当前版本中,如果您在 React 事件处理程序中,它们将被一起批处理。React 批处理在 React 事件处理程序期间完成的所有 setState,并在退出其自己的浏览器事件处理程序之前应用它们。
但事实是,这个片段似乎证明了 a 内多个setState
调用的更新useEffect()
是批处理的。
问题
setState()
React 是否也总是为内部的多个调用批量更新useEffect
?它还能在哪里做到这一点?
注意:根据他的回答,在下一个主要版本(可能是 v17)中,默认情况下 React 将在任何地方进行批处理。
SNIPPET:useEffect()
在多个setState()
调用中批量更新
function App() {
console.log('Rendering app...');
const [myState,setMyState] = React.useState(0);
const [booleanState, setBooleanState] = React.useState(false);
console.log('myState: ' + myState);
console.log('booleanState: ' + booleanState);
React.useEffect(()=>{
console.log('Inside useEffect...');
setMyState(1);
setMyState((prevState) => prevState +1);
setMyState(3);
setMyState(4);
setMyState(5);
setBooleanState(true);
},[]);
return(
<div>App - Check out my console!</div>
);
}
ReactDOM.render(<App/>, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.3/umd/react-dom.production.min.js"></script>
<div id="root"/>