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

useEffect会导致无限循环

慎望
2023-03-14

我对react钩子和效果有点陌生,在使用useEffect时遇到了问题

useEffect( _ => {
(async _ => {
  const res = await axios.get('/api/laf/getreportlostitem');
  getReports(res.data);
  setLoading(false);
})();},[reports]);

上面的代码是我构建的useEffect,用于使用axios获取数据库中的所有数据,并且我将所有数据放在一个称为reports的状态中。

// Data State for getting the reports 
const [reports, getReports] = useState([]);

但是当我console.log报告时,它会导致无限循环。我不知道为什么?

让我给你看一个我做的简单动作。

我正在做一个按钮,当它被点击时,报告的状态(按id)将被更新。

  <Button onClick={ _ => setAsFound(row.id)} variant="contained" color="primary">Set as found</Button>
                        |
<ClaimedButton onClick={ _ => setAsClaimed(row.id)} variant="contained" color="primary">
                        Set as claimed
                        </ClaimedButton>

这是该州报告结构的样本草案。

{ name, src, yr, campus, department, course, details, contact, status }

如您所见,对象中有一个“状态”数据。因此,当我单击其中一个按钮时,报告状态下的数据将被更新。下面是按钮的onclick功能。

const setAsFound = id => {

  if(window.confirm("Are you sure this report item is now found?") ){
     const updateStatusFound = {
        status: foundData
      };

      props.setReportToFound(id, updateStatusFound);
  }

};

const setAsClaimed = id => {

  if(window.confirm("Are you sure this report item is now claimed?")){
    const updateStatusClaimed = {
      status: claimedData
    };

    props.setReportToClaimed(id, updateStatusClaimed);
  }

};

founData和claimedData值如下所示。

const [foundData, setFoundData] = useState('Found, Not Claimed');


const [claimedData, setClaimedData] = useState('Found and Claimed');

这只是操作完成后将在数据库中发送的状态值。

其他代码只是我正在处理的操作和功能。但我主要关心的是,为什么报表状态会导致无限循环,甚至是组件中刚刚呈现的数据?我甚至有一个依赖项,这样当数据被更新时,报表状态将被更新,并重新呈现数据。我尝试过不将报告作为依赖项。但问题是,当我删除它时,数据不会更新。有没有办法阻止无限循环?

共有2个答案

宁锐
2023-03-14

我解决我的问题。

我重组了我的使用效果,它将如何立即更新值,而不会导致无限循环。

我在这里找到了答案。

为什么每次渲染都会调用“useEffect”中的清理函数?

陈刚洁
2023-03-14

您将报告作为依赖项传递给useEffect挂钩,这意味着每次状态变量报告更改时,useEffect都将再次触发。如果您只想模拟componentDidMount并查询一次数据,那么您不必向useEffect传递任何依赖项。

 类似资料:
  • 我正在创建一个简单的议程应用程序,它作为后端连接到Firebase。我想在每次写入时获取数据,我试图避开一个无限循环。 初始todos状态为null。然而,当我获取Firebase数据时,它会发生变化,然后导致组件本身的重新渲染,这将导致另一次获取,再次导致无限循环。我已经因此打破了Firebase中火花计划的限制,并因为临时阻塞而浪费了几天的工作。我认为这可以用useCallback钩子修复,但

  • 我的期望: 如果用户输入的Int不在正确的范围内,程序将给他另一次机会,直到用户给出正确的类型。 所以,我需要一个块。但我有一个无限循环。 我的代码: 我读到: 重置. nextLine()扫描仪 使用扫描仪。扫描仪后面的nextLine()。nextInt() nextInt()的扫描仪错误 扫描仪在使用next()或nextFoo()后跳过nextLine()? 如何使用java.util.扫

  • 我在使用useEffect时搜索了很多关于无限循环的帖子,但仍然没有找到答案 在useEffect中,我试图调用get accounts api,当然,我放置了一个空数组,因为我只希望它在渲染后运行一次。但目前我喜欢添加“addAccount”功能。因此,如果我按下add按钮,它就会发送一个post请求。这里是一个问题,我想检查值是否已更改,因此我将值放入第二个参数,即空数组,它会导致无限循环。但

  • 关于各种扫描仪方法的工作原理,我肯定遗漏了一些明显的东西,但这真的没有任何意义: 此代码导致无限循环: 虽然此代码有效: 这是来自Oracle的文档,我不确定它是否适用或它的含义:“此方法可能会在等待扫描输入时阻塞,即使之前调用hasNext()返回true也是如此。”(http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.h

  • 问题内容: 我试图弄清楚为什么页面在单击时没有导航到其模板。URL更新,并且我没有JS错误。。我相信它 会加载 文件,但随后会无限加载控制器。我在SessionsController的实例化中添加了代码后,发现了这一点。 布局 我的看法 我的JS 在里面,我有个大而光明的人: 问题答案: 我唯一看到的是缺少括号和逗号。您可以尝试以下方法:

  • 我有一个看起来很简单的问题,但由于某种原因我无法绕过它。基本上我的程序正在导致一个无限循环,我不知道为什么。 下面是我陷入的特定循环: 当我运行它时,它总是问我输入列#。我给它一个数字,它接受这个数字,$response变为True,但while循环继续运行,就好像<code>的$response</code>为false一样。我是Perl新手,所以可能我遗漏了一些东西,但是($response=