javascript - 为什么函数组件中的 setState(hook) 会导致无限循环?

标签 javascript reactjs react-hooks

这是代码:

import React, { useState } from 'react'

function App() {
  const [a, setA] = useState(1)
  setA(2)
  return (
    <div>
      <h1>{a}</h1>
    </div>
  );
}

Error. Too many re-renders. React limits the number of renders to prevent an infinite loop.



为什么会导致无限循环?

我认为原因是功能组件就像 渲染函数 ,所以setState时会导致死循环在 render功能。

有官方解释吗?

最佳答案

在每个状态更新 React将重新渲染组件并运行所有函数体,如 setA(2)不包含在任何钩子(Hook)或函数中,并且是函数/组件主体的一部分。 React将在每个渲染周期执行此操作。这会形成一个无限循环。
在组件挂载时,React 将设置状态并随着状态更新而进行组件更新,再次有状态更新 React 将再次重新渲染组件。这个循环将一直持续到 react 达到重新渲染限制。
您可以通过将状态更新包装在 Hook 中来避免这种情况。

import React, { useState } from 'react'

function App() {
  const [a, setA] = useState(1)
  useEffect(() => {
    setA(2)
  },[]);
  
  return (
    <div>
      <h1>{a}</h1>
    </div>
  );
}

关于javascript - 为什么函数组件中的 setState(hook) 会导致无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60322329/

相关文章:

javascript - 我们可以在react中的<return>标签中使用Math.Round吗

javascript - CKEditor 5 和 ReactJS : I can't edit the toolbar

javascript - React.js 中可以有多个 <Switch> 吗?

javascript - 如何获取数据并存储在 React Context API 中?

reactjs - 使用 React Hooks 创建和操作组件

JavaScript IndexedDb : searching a range of value using multiple keys

javascript - 在summernote中添加提示词

reactjs - 模块 '"<文件路径>/react-redux "' has no exported member ' Dispatch'

javascript - React 组件的计时器/计数器 - 使用 setInterval() 增加值后值仍保持为 0

reactjs - 如何将 URL 参数传递给选择器