Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';在React中,从异步调用批处理状态更新的最佳方法是什么?_Javascript_Reactjs_Asynchronous_Setstate - Fatal编程技术网

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

Javascript 什么';在React中,从异步调用批处理状态更新的最佳方法是什么?,javascript,reactjs,asynchronous,setstate,Javascript,Reactjs,Asynchronous,Setstate,我从中了解到,如果事件基于非React即setTimeout、Promise调用,React不会自动批处理状态更新。(简而言之,任何来自Web API的事件。) 这与基于反应的事件不同,例如onClick事件(etc)中的事件,这些事件由反应限制渲染批处理。这在中得到了很好的说明,这从本质上证明,虽然这只会触发一个渲染: 函数handleClickWithoutPromise(){ 刚毛('aa'); 挫折(“bb”); } 这将触发两个: 函数handleClickWithPromise()

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

这与基于反应的事件不同,例如onClick事件(etc)中的事件,这些事件由反应限制渲染批处理。这在中得到了很好的说明,这从本质上证明,虽然这只会触发一个渲染:

函数handleClickWithoutPromise(){
刚毛('aa');
挫折(“bb”);
}
这将触发两个:

函数handleClickWithPromise(){
Promise.resolve()然后(()=>{
刚毛('aa');
挫折(“bb”);
});
}
对我来说,这是有问题的,因为在第一次页面加载时,我向后端发送了一个请求,并接收用于更新许多离散状态对象的各种数据。这会触发十几次重新渲染,这显然不是最优的

在不同的职位上提供了一些选择,但请提供一些专家指导,说明哪些是最佳做法:

  • Redux(我还没有使用这个库,我担心要彻底检查我的状态处理)。这似乎也是一个常见的问题,如果React有自己的本地方式批处理异步状态更新的话,我会认为这是一个常见的问题
  • userReducer并将我的所有状态绑定到一个。然后,我可以用一次状态更新来更新所有内容。考虑到我的不同状态在直觉上是如何保持离散的,这是没有意义的
  • 按照中的建议,使用
    ReactDOM.unstable_batchedUpdate(()=>{…})

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

作者还补充说:

虽然这个功能被认为是“不稳定的”,但显然 打算在以下版本中解决这一问题

未来版本中的“” (可能是React 17及更高版本),默认情况下React将批处理所有更新 丹·阿布拉莫夫说,所以你不必考虑这个问题


React v17在这里,测试起来应该很简单,对吗?快速扫描,除了在(实验性)并发模式下进行改造外,我没有看到任何提到的内容: