React Hooks - 等待多个状态更新完成

     2023-02-19     98

关键词:

【中文标题】React Hooks - 等待多个状态更新完成【英文标题】:React Hooks - Wait for multiple state updates to finish 【发布时间】:2021-06-18 06:43:38 【问题描述】:

我有以下状态

const [humans, setHumans] = useState([]);
const [animales, setAnimals] = useState([]);

还有下面的函数

const f = () =>  
   console.log(humans);
   console.log(animals);

只有在下面的 useEffect 完成更新两个状态时才需要执行

useEffect(() => 
   setHumans([ ... ]);
   setAnimals([ ... ]);
   f();
, []);

如何确保在两个异步状态更新完成后执行 f?

【问题讨论】:

为什么不添加一个 useEffect hook 与人类和动物作为依赖项,并在那里检查您的状况。例如:if(humans.length && animals.length),然后执行f() 顺便说一句,您的 useEffect 只会在初始渲染时执行... 您需要仅在两个状态更新完成后执行 当两个状态都完成更新时。我需要等待多个状态更新。 【参考方案1】:

尝试使用自定义钩子“useStateWithCallback”并在回调链中执行状态更新。

useStateWithCallback

import  useState, useRef, useEffect  from "react";

export default function useStateWithCallback(initialState) 
  const [state, setState] = useState(initialState);

  const callbackRef = useRef(null);

  const setStateCallback = (state, callback) => 
    callbackRef.current = callback; // store passed callback to ref
    setState(state);
  ;

  useEffect(() => 
    if (callbackRef.current) 
      callbackRef.current(state);
      callbackRef.current = null; // reset callback
    
  , [state]);

  return [state, setStateCallback];

代码

const [humans, setHumans] = useStateWithCallback([]);
const [animals, setAnimals] = 
useStateWithCallback([]);

const logStates = () => 
   console.log(humans);
   console.log(animals);


const updateStates = () => 
   return new Promise((resolve) => 
      setHumans([...], () => 
         setAnimals([...], resolve);
      
   );


useEffect(() => 
   (async () => 
      await updateStates();
      logAnimals();
   )();
, []);

通过这个例子,你也可以在 useEffect 之外使用“在做某事之前等待多个状态更新”的功能,就像这样:

const otherFunction = async () => 
    await updateStates();
    doSomething();

如果您遇到状态不是最新的问题,则将该方法包装在 useCallback 中,将状态添加到 deps 数组中。

【讨论】:

另外,你可以使用 useStateWithPromise ***.com/questions/53898810/…

React Hooks 表单处理:使用多个字符串项和一个数组项更新对象的状态

】ReactHooks表单处理:使用多个字符串项和一个数组项更新对象的状态【英文标题】:ReactHooksFormHandling:Updatethestateofanobjectwithmultiplestringitemsandonearrayitem【发布时间】:2020-07-1022:48:51【问题描述】:我正在学习使用钩子制作应用程... 查看详情

React Hooks:使用useState更新状态不会立即更新状态[重复]

...发布时间】:2020-05-1211:50:08【问题描述】:我有一个包含多个字段的表单,其中一个字段包含一个对象数组。它几乎添加了一个对象,其中包含来自主窗体的子窗体的值。constad 查看详情

React Hooks - 使用新道具更新状态

】ReactHooks-使用新道具更新状态【英文标题】:ReactHooks-updatestatewithnewprops【发布时间】:2020-06-1907:13:29【问题描述】:我对Hooks的新实现感到非常困惑。如何为收到的道具设置状态值,甚至在收到道具时不会重新渲染。(这是我... 查看详情

React hooks:如何检测特定状态变量何时更新

】Reacthooks:如何检测特定状态变量何时更新【英文标题】:Reacthooks:howtodetectwhenparticularstatevariablehasupdated[duplicate]【发布时间】:2021-08-1618:12:06【问题描述】:在React挂钩之前,我会使用componentDidUpdate(prevProps,prevState),如果我只... 查看详情

我的状态没有使用 React Hooks 更新

】我的状态没有使用ReactHooks更新【英文标题】:MystateisnotupdatingusingReactHooks【发布时间】:2020-11-2509:19:22【问题描述】:我有一个在更改时触发的事件。此事件检查哪个过滤器已更改,然后相应地更新状态。如果我不使用reacthook... 查看详情

使用 React Hooks 更新状态数组的所有对象元素

】使用ReactHooks更新状态数组的所有对象元素【英文标题】:UpdateallObjectElementsofaStateArraywithReactHooks【发布时间】:2021-04-0703:51:08【问题描述】:我有一个存储这些对象的状态数组:consthoursArr=[value:1,label:"hour",isDisabled:false,value:2,la... 查看详情

如何在 React Hooks 的对象数组中更新状态`onChange`

】如何在ReactHooks的对象数组中更新状态`onChange`【英文标题】:HowdoIupdatestates`onChange`inanarrayofobjectinReactHooks【发布时间】:2019-09-2301:42:48【问题描述】:我已检索使用useState存储在对象数组中的数据,然后将数据输出到表单字段... 查看详情

当 React Hooks 中的 redux 状态更改时,道具不会更新

】当ReactHooks中的redux状态更改时,道具不会更新【英文标题】:PropsnotupdatingwhenreduxstatechangeinReactHooks【发布时间】:2019-12-1123:50:15【问题描述】:我正在尝试在ReactHooks项目上实现Redux,但它似乎效果不佳。我在这里做错了吗?red... 查看详情

在状态对象中使用具有多个键/值对的 React Hooks

】在状态对象中使用具有多个键/值对的ReactHooks【英文标题】:UsingReactHookswithmorethanoneKey/ValuePairinStateObject【发布时间】:2019-12-0919:41:04【问题描述】:我想知道最好的方法是在FunctionalComponent中为state定义多个key/value对。在课堂... 查看详情

React Hooks 在设置状态的同时处理多个动作的方式是啥?

】ReactHooks在设置状态的同时处理多个动作的方式是啥?【英文标题】:WhatistheReactHookswayofhandlingmultipleactionswhilealsosettingstate?ReactHooks在设置状态的同时处理多个动作的方式是什么?【发布时间】:2021-08-0310:40:05【问题描述】:我... 查看详情

React hooks 功能组件防止在状态更新时重新渲染

】Reacthooks功能组件防止在状态更新时重新渲染【英文标题】:Reacthooksfunctioncomponentpreventre-renderonstateupdate【发布时间】:2019-07-2800:37:21【问题描述】:我正在学习ReactHooks,这意味着我将不得不从类转向函数组件。以前在类中,... 查看详情

等待带有 React Hooks 的 Redux Action

】等待带有ReactHooks的ReduxAction【英文标题】:AwaitingReduxActionw/ReactHooks【发布时间】:2019-10-2305:42:24【问题描述】:我正在尝试处理表单提交以在数据获取发生时显示加载组件。我想在数据加载到我的Redux商店时显示数据。现在,... 查看详情

useSelector 函数没有更新调度函数后的状态 -react hooks

】useSelector函数没有更新调度函数后的状态-reacthooks【英文标题】:useSelectorfunctionisnotupdatingthestateofafterdispatchfunction-reacthooks【发布时间】:2020-09-0614:42:58【问题描述】:我正在执行一个身份验证模块,当我单击登录按钮时,我正... 查看详情

React:使用 Hooks 为深度嵌套对象设置状态

】React:使用Hooks为深度嵌套对象设置状态【英文标题】:React:SettingStateforDeeplyNestedObjectsw/Hooks【发布时间】:2020-01-0723:08:17【问题描述】:我正在使用React中深度嵌套的状态对象。我的代码库要求我们尝试使用函数组件,因此每... 查看详情

react封装自定义hooks完成日常loading与error俘获,以及登录状态管理usecontext代替redux

封装自定义Hooks完成loading以及俘获失败功能我们知道,一般我们用户交互都是有loading,以及接口报错,那么是否我们之前写的代码都是类似于,网络请求前setloading(true),返回结果在setLoading(false),报错的... 查看详情

React Hooks useState+useEffect+event 给出过时的状态

】ReactHooksuseState+useEffect+event给出过时的状态【英文标题】:ReactHooksuseState+useEffect+eventgivesstalestate【发布时间】:2019-08-0420:32:36【问题描述】:我正在尝试将事件发射器与ReactuseEffect和useState一起使用,但它总是获取初始状态而不... 查看详情

如何使用 React Hooks 和 Context API 正确地将来自 useEffect 内部调用的多个端点的数据添加到状态对象?

...何使用ReactHooks和ContextAPI正确地将来自useEffect内部调用的多个端点的数据添加到状态对象?【英文标题】:HowdoIcorrectlyadddatafrommultipleendpointscalledinsideuseEffecttothestateobjectusingReactHooksandContextAPI?【发布时间】:2020-04-0504:46:48【问题描... 查看详情

React hooks - 如何测试多个 useState hooks

】Reacthooks-如何测试多个useStatehooks【英文标题】:Reacthooks-howtotestmultipleuseStatehooks【发布时间】:2020-12-2817:06:02【问题描述】:我有一个很少有useState钩子的组件:const[resizing,setResizing]=React.useState(false);const[x,setX]=React.useState(0);cons... 查看详情