我从这篇文章中了解到,React在处理非React事件(例如setTimeout、Promise调用等Web API事件)时不会自动批处理状态更新。(换句话说,对于来自Web API的任何事件,React都不会批量处理。)
而对于基于React的事件,例如onClick事件等,React会将其批处理以限制渲染次数。这在这个答案中有很好的说明。该答案基本上演示了尽管触发了一个render,但React仍然能够一次性更新多个状态的内容。
这将会触发两个:
而对于基于React的事件,例如onClick事件等,React会将其批处理以限制渲染次数。这在这个答案中有很好的说明。该答案基本上演示了尽管触发了一个render,但React仍然能够一次性更新多个状态的内容。
function handleClickWithoutPromise() {
setA('aa');
setB('bb');
}
这将会触发两个:
function handleClickWithPromise() {
Promise.resolve().then(() => {
setA('aa');
setB('bb');
});
}
对我来说,这是有问题的,因为在我的第一次页面加载时,我发送了一个请求到后端并接收各种数据,用于更新许多不同的状态对象。这会触发十几次重新渲染,显然不是最优解。
不同的帖子中提供了一些选项,但我希望得到一些专家指导,了解哪种是最佳实践:
- Redux(我还没有使用过这个库,并且担心要彻底改变我的状态处理方式)。这似乎是一个非常普遍的问题,我认为React应该有自己的原生方法来批量异步地更新状态。
- 使用userReducer,将所有状态捆绑在一起。然后可以通过一次状态更新来更新所有内容。考虑到我的不同状态在直觉上更适合保持离散。
- 按照此答案中的建议使用
ReactDOM.unstable_batchedUpdates(() => { ... })