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

导致无限循环的useEffect依赖项

宋涵忍
2023-03-14

我正在创建一个简单的议程应用程序,它作为后端连接到Firebase。我想在每次写入时获取数据,我试图避开一个无限循环。

useEffect(() => {
    const getTodos = () => {
      console.log("I will run");
      db.collection("Users")
        .doc(user.email)
        .collection("Todos")
        .get()
        .then((snapshot) => {
          const loadedTodos = snapshot.docs.map((docs) => {
            return {
              todo: docs.data().todo,
              isCompleted: docs.data().isCompleted,
              id: docs.id,
            };
          });
          setTodos(loadedTodos ?? []);
        });
    };
    getTodos();
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [todos]);

初始todos状态为null。然而,当我获取Firebase数据时,它会发生变化,然后导致组件本身的重新渲染,这将导致另一次获取,再次导致无限循环。我已经因此打破了Firebase中火花计划的限制,并因为临时阻塞而浪费了几天的工作。我认为这可以用useCallback钩子修复,但我不知道如何修复。此外,我想在聊天应用程序中添加相同的功能(数据将从两侧写入)。只有当双方中的一方写了,或者在这种情况下它必须是一个无限循环时,才可以重新渲染吗?

共有2个答案

澹台岳
2023-03-14

我刚刚添加了一个新的useState钩子ShouldComponentRender,它在调用函数(addTodos、deleteTodo、setCompletionState)时会发生更改,然后ShouldComponentRender状态被添加为useEffect钩子的依赖项。给了我想要的结果。谢谢

孟茂学
2023-03-14

您希望在效果中的依赖关系是user.email

useEffect(() => {
   const getTodos = () => {
     console.log("I will run");
     db.collection("Users")
       .doc(user.email)
       .collection("Todos")
       .get()
       .then((snapshot) => {
         const loadedTodos = snapshot.docs.map((docs) => {
           return {
             todo: docs.data().todo,
             isCompleted: docs.data().isCompleted,
             id: docs.id,
           };
         });
         setTodos(loadedTodos ?? []);
       });
   };
   getTodos();
 }, [user.email]);

您可以这样理解:每当user.email发生变化时,我都想重新绘制待办事项列表。

编辑:正如其他人所说,观察无限循环的原因是效果本身改变了效果的依赖性,从而导致效果再次运行。这通常可以通过“提升状态”来解决,但在这种情况下,这是因为您使用了错误的依赖项。

 类似资料:
  • 我对react钩子和效果有点陌生,在使用useEffect时遇到了问题 上面的代码是我构建的useEffect,用于使用axios获取数据库中的所有数据,并且我将所有数据放在一个称为reports的状态中。 但是当我console.log报告时,它会导致无限循环。我不知道为什么? 让我给你看一个我做的简单动作。 我正在做一个按钮,当它被点击时,报告的状态(按id)将被更新。 这是该州报告结构的样本

  • 我一直试图了解钩子,特别是useEffect及其依赖项列表,但出于某种原因,下面的代码一直在无休止地运行。我发现了这个非常相关的问题,但没有能够按照那里的建议使我的代码工作。下面是错误代码,您可能必须启用浏览器控制台才能看到循环。 实际上,我有一个状态(),它使用fetch(在本例中是假的)进行更新。当尚未提取帐户时,被设置为false。这确保了在调用时,它不会获取余额。我希望控制台最初记录一个n

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

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

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

  • 我使用的是org.apache.karaf.tooling/features-maven-plugin的2.3.12版本。 当cxf-core和CXF-Commands之间添加循环依赖项时,CXF3.2.x版本似乎已经开始出现这种情况。 它会输出数百个这些,然后抛出堆栈溢出异常: 下面是我的pom的pom插件部分: 这里是cxf特性的冒犯点--注意,“CXF-Core”对“CXF-Commands