当前位置: 首页 > 知识库问答 >
问题:

如何在使用更新循环时获得useEffect中的更新状态

萧琛
2023-03-14

您可能知道,在正常模式下,当状态更新时,我们使用更新依赖项来获得通知,如下所示:

const [val, setVal] = useState();


useEffect(() => {}, [val]]);

但在我的例子中,我的状态中有一个数组,我正在尝试在useEffect的循环中更新它,如下所示:

const [val, setVal ] = useState([...]);

useEffect(() => {
   anotherArr.forEach(i => {
      // get val and modify some indexes 
      setVal(modifiedValuesArray);
   }
}, []);

在本例中,每次forEach循环运行时,我都会得到初始val(我知道,因为val不是useffect的依赖项),但如果我将其作为依赖项,它将更新两次。解决这个问题的办法是什么?

编辑:基本上,我的意思是,当我在useffect中更新一轮循环中的状态时,在下一轮中,我不会得到更新的状态,而是进入循环之前的初始状态。我知道,这是因为useEffect的性质,它给了我们一个记忆中的状态值(因为我们没有将其作为依赖项传递以避免额外的执行),但是在这些类型的场景中,解决方案是什么呢。

共有3个答案

燕朝明
2023-03-14

仅使用setVal一次,而不是在forEach循环期间使用setStateasync,因此您不能像它的同步那样依赖它。在您的示例中,setVal将在将来某个时间执行。。您是否有一个codesandbox示例?

编辑:您不会在“下一轮”中获得更新状态<代码>设置状态将执行N次,并将其放入更新队列,React可能只更新最后一个设置状态值以进行优化。此外,示例useffect将只运行一次。。

万乐逸
2023-03-14

每当需要使用状态的当前值更新状态时,都需要将函数发送到状态设置器,该设置器会将状态的更新当前值作为参数提供给您。因此,在您的情况下,它将如下所示:

const [val, setVal ] = useState([...]);

useEffect(() => {
  anotherArr.forEach(i => {
    setVal((currVal) => {
      let modifiedValuesArray = [];
      // your update logic here (use currVal instead of val)
      return modifiedValuesArray;
    });
  });
}, []);
查学文
2023-03-14

我找到了这个答案:(https://stackoverflow.com/a/59422750/2728431)它解决了我的问题。

为了获得更新状态,(正如@usafder在评论中所说),我们需要在箭头函数中传递状态作为值,就像这样:

const [val, setVal ] = useState([...]);

useEffect(() => {
   anotherArr.forEach(i => {
      setVal(val => {
         // modify based on provided val on arrow function
         return modifiedValuesArray
      });
   }

}, []);
 类似资料:
  • 我不熟悉React钩子和React 16.13.1。 我将实现能够处理登录的Auth组件。 但是它似乎没有正确更新状态,即使使用响应对象调用。 这个代码有什么问题?

  • 我有一个组件,看起来像: 它从datepicker组件获取currentDate属性,如下所示: 当我从日期选择器中选择新日期时,this.props.current子组件上的日期会更新。这是我想要的日期。但是,当更新该prop时,它不会用新的预期数据重新呈现表。我意识到我必须更新子表的状态才能重新渲染。我试图通过设置当前日期:this.props.current日期来设置ftchData()方法

  • 问题内容: 我正在制作一个运行一些cmd命令(USMT和文件传输)的程序 它工作正常,但是只有在完成操作后,我才从文本框中的cmd获取最后一行。我希望它打印cmd实时输出的内容。 问题答案: 问题的根本原因是您阻止了事件调度线程,这将阻止在执行命令后更新UI。 Swing是一个单线程框架,这意味着您不应在EDT上下文中执行阻塞或长时间运行的代码。Swing也不是线程安全的,这意味着永远不要在EDT

  • 我正在尝试使用reactjs通过调用axios创建用户配置文件。但我只能在使用Effect时看到更新的状态,而在其他地方看不到。在loginPage中。js,我正在尝试获取entryfirstName、entryLastName和role的最新状态,并将其发布到登录函数中,该函数将返回到我的userProvider.js中。我不知道如何更新状态,所以任何反馈都比我得到的要好。 我是新手反应,我无法

  • 问题内容: 我在SQL SELECT语句返回的行上有一个循环,并且在对行的数据进行了一些处理之后,有时我想更新该行的值。循环主体中的处理非常重要,我无法用SQL编写。当我尝试为选定的行执行UPDATE时,我得到一个错误(在Perl的DBD :: SQLite :: st执行失败下:数据库表已锁定)。是否有一种可读,高效且可移植的方式来实现我要完成的任务?如果失败,是否有DBD或SQLite特定的方

  • 问题内容: 是否有原因在循环中调用会阻止其多次更新状态? 我有一个非常基本的jsbin,突出了我所看到的问题。有两个按钮。一个将状态计数器更新为1。另一个在循环中调用One的基础函数- 似乎将多次更新状态。 我知道此问题的几种解决方案,但我想确保首先了解这里的基本机制。为什么不能循环调用?我是否笨拙地编写了代码,以至于无法达到预期的效果? 问题答案: 从React Docs: setState()