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

react hook useEffect无限循环,尽管依赖项列表

和丰羽
2023-03-14

我一直试图了解钩子,特别是useEffect及其依赖项列表,但出于某种原因,下面的代码一直在无休止地运行。我发现了这个非常相关的问题,但没有能够按照那里的建议使我的代码工作。下面是错误代码,您可能必须启用浏览器控制台才能看到循环。

// a fake fetch for the sake of the example
function my_fetch(f, delay) {
  setTimeout(f, delay)
}

// if account is not loaded then useEffect should not fetch the balance
function useFetchBalance(account_id, account_loaded) {

  const [balance, setBalance] = useState(null)

  useEffect(() => {
    if (!account_loaded) return; // only fetch if dependency is resolved
    my_fetch(() => setBalance(41 + account_id), 3000)
  }, [account_id, account_loaded])

  return balance
}


function App() {

  const [account, setAccount] = useState({ id: null, loaded: false })
  my_fetch(() => setAccount({ id: 1, loaded: true }), 3000)

  const balance = useFetchBalance(account.id, account.loaded)
  console.log(balance)

  return null
}

实际上,我有一个状态(account),它使用fetch(在本例中是假的)进行更新。当尚未提取帐户时,account.loaded被设置为false。这确保了在调用usefetchbalance时,它不会获取余额。我希望控制台最初记录一个null值,6秒后(3用于获取帐户,3用于获取余额)记录42。然而,它首先打印null 3次,然后以似乎是两批的方式无休止地打印42次。我是非常新的反应,所以任何帮助都将非常感谢。

共有1个答案

司空思聪
2023-03-14

您在app中的my_fetch组件在每次重新呈现时都会触发,在app挂载时使用useeffect调用一次,这将确保my_fetch组件挂载时只运行一次,而不是在每次重新呈现时运行一次

不要忘记React函数组件毕竟是函数,所以在每次重新呈现时都会执行函数,这就是为什么我们需要使用React提供的帮助函数

function App() {
  const [account, setAccount] = useState({ id: null, loaded: false })
  const balance = useFetchBalance(account.id, account.loaded)

  useEffect(() => {
    my_fetch(() => setAccount({ id: 1, loaded: true }), 3000)
  }, [])

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

  • 问题内容: 我有一个模块化的maven项目,其中两个模块“ BIZ”和“ EJB”包含如下内容: 如您所见, “ EJB”依赖于“ BIZ”, 因为它使用 MyClassX (实际上,它使用了BIZ的几种类别)。这就是 ImplFactory 使用反射实例化 InterfaceImpl 的原因。问题是 cl.newInstance() 将抛出 ClassCastException, 因为这两个模块

  • 我搜索了Google、StackOverflow和Github问题,但没有找到任何内容 https://docs.temporal.io/docs/java-implementing-workflows#child-workflows 似乎我可以轻松地创建一个包含多个工作流的圆圈,将其他人称为子工作流。工作流甚至可以一遍又一遍地调用自己。节奏/时间是否提供任何东西来防止这种情况或超出范围? 提前感

  • 我正在用我的java书复习数据结构,我需要重新创建一个循环链表。我对这个无限循环的链表有问题,弄不清楚为什么。我可以将值插入到列表中,但是打印和删除这些值似乎会无限循环最初插入的值。我如何更改我的List类以避免无限循环? CircularList.Class 链接类

  • 问题内容: 好的,所以我想用杰克逊json转换器测试一些东西。我正在尝试模拟图形行为,所以这些是我的POJO实体 标签是必需的,以避免序列化时出现异常。当我尝试序列化一个对象(在文件或简单字符串上)时,一切正常。但是,当我尝试反序列化对象时,它将引发异常。这是简单的测试方法(为简单起见,省略了try / catch) 这是抛出的异常(当然,重复两次) 那么,问题的原因是什么呢?我该如何解决?我还需

  • 问题内容: 好的,所以我想用杰克逊json转换器测试一些东西。我正在尝试模拟图形行为,所以这些是我的POJO实体 标签是必需的,以避免序列化时出现异常。当我尝试序列化一个对象(在文件或简单字符串上)时,一切正常。但是,当我尝试反序列化对象时,它将引发异常。这是简单的测试方法(为简单起见,省略了try / catch) 这是抛出的异常(当然,重复两次) 那么,问题的原因是什么呢?我该如何解决?我还需