从 React 中的异步调用批处理状态更新的最佳方法是什么?

What's the best way to batch state updates from async calls in React?

我从 了解到 React 不会自动批处理状态更新,如果事件是 non-react 基于的,即 setTimeout,Promise 调用。 (简而言之,来自 Web API 的任何事件。)

这不同于 react-based 事件,例如来自 onClick 事件(等)的事件,这些事件通过 React 进行批处理以限制渲染。这在 中得到了很好的说明,它本质上表明虽然这只会触发一个渲染:

  function handleClickWithoutPromise() {
    setA('aa');
    setB('bb');
  }

这将触发两个:

  function handleClickWithPromise() {
    Promise.resolve().then(() => {
      setA('aa');
      setB('bb');
    });
  }

对我来说这是有问题的,因为在我第一次加载页面时,我向后端发送了一个请求并接收了用于更新大量离散状态对象的各种数据。这会触发十几次重新渲染,这显然不是最佳选择。

在不同的帖子中提供了一些选项,但希望得到专家指导以了解最佳做法:

因此,以防万一没有更好的答案,我发现这个 article on Medium 显示了 ReactDOM.unstable_batchedUpdates(() => { ... }) 工作的一个非常好的简单示例。 (您必须向下滚动到以下部分:“如何强制批处理?”)。

作者还补充说:

Although this function is supposedly “unstable”, React apparently intends to address this in the following versions.

“In future versions (probably React 17 and later), React will batch all updates by default so you won’t have to think about this”, according to Dan Abramov.