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

在映射函数内调用useState钩子导致无限循环

吴胜
2023-03-14

我目前正在构建一个动态表单引擎,希望在呈现应答摘要组件时显示redux存储区的结果。我认为最好的方法是在加载answerSummary组件后设置“complete”状态并将其设置为true,但在map函数中这样做不起作用,并抛出无限循环react错误。

代码如下:

function App() {
  let [complete, setComplete] = useState(false);
  return (
    <div>
      <h1>Form App Prototype</h1>
      <Router>
        <Switch>
          {Object.values(Database.steps).map(step => {
            step.name === 'answerSummary' ? setComplete(true) : setComplete(false);
            return (

              <Route exact path={`/${step.name}`} render={() =>
                <Step step={step} />

              }
              />
            )
          })}
        </Switch>
      </Router>
        <br></br>
        <div style={{display: complete? 'block' : 'none'}}><StoreVisual/></div>

    </div>
  );
}

export default App;

编辑:我知道你不能在渲染中设置状态-我这样写是为了尝试和传达我想要做的事情

共有3个答案

越文康
2023-03-14

不要在返回中内联运行该代码,而是在函数逻辑中构建数组:

function App() {
  let [complete, setComplete] = useState(false);
  // build an array of Route components before rendering
  // you should also add a unique key prop to each Route element
  const routes = Object.values(Database.steps).map(step => {
    step.name === 'answerSummary' ? setComplete(true) : setComplete(false);
    return <Route exact path={`/${step.name}`} render={() => <Step step={step} />} />
  })
  return (
    <div>
      <h1>Claimer Form App Prototype</h1>
      <Router>
        <Switch>
          // render the array 
          {[routes]}
        </Switch>
      </Router>
      <br></br>
      <div style={{display: complete? 'block' : 'none'}}><StoreVisual/></div>
    </div>
  );
}

export default App;

我认为你不需要根据这个逻辑调用set完成(false),所以你应该用if语句替换你的三进制:

if (step.name === 'answerSummary') {
  setComplete(true)
}

并避免进行不必要的函数调用

吕皓
2023-03-14

如果只想渲染

 const [index, setIndex] = useState(0);

每次有人前进一步,都会增加该值。

您必须将setIndex或任何您称之为setter的内容传递到步骤组件中才能执行此操作。

然后可以渲染

<div>
      <h1>Claimer Form App Prototype</h1>
      <Router>
        <Switch>
          {Object.values(Database.steps).map(step => 
              <Route exact 
                     path={`/${step.name}`} 
                     render={() => <Step step={step} /> }/> )}
        </Switch>
      </Router>
        <br></br>
        {Database.steps[index] === 'answerSummary' && <StoreVisual/>}
    </div>

这种方法也为您提供了一种简单的方法,让人们从表单的中间开始。假设你想让人们将来保存半成品表单,你只需更改/更新索引钩子的默认值。

壤驷志学
2023-03-14

我对您的问题的理解是,您试图在安装应答摘要组件后显示结果。您可以通过使用组件安装时运行的useffect挂钩来实现这一点。https://reactjs.org/docs/hooks-effect.html

 类似资料:
  • 我正在尝试重定向仪表板页面上的登录用户。 这是我的代码: 当用户登录时,我的应用程序正在运行一个带有方法的循环。 我已经在StackOverflow上考虑过两个类似的问题,它们是: react超出最大调用堆栈大小 React-router,onEnter导致身份验证无限循环 我两种都试过,但不幸的是,那些例子对我没有帮助。(我也是React的初学者) 请告诉我我的代码有什么问题?

  • 我有一个应用程序,当试图从异步函数内部使用useState钩子时出错。 这里是App.js 这里是错误 元素类型无效:需要字符串(对于内置组件)或类/函数(对于复合组件),但得到:未定义。您可能忘记了从定义组件的文件中导出组件,或者您可能混淆了默认导入和命名导入。 检查的渲染方法。 index.js package.json 更新错误-删除!认证 元素类型无效:需要字符串(对于内置组件)或类/函数

  • 我想使用React在表中显示一些记录,但我得到了这个错误: 无效的挂接调用。钩子只能在函数组件的主体内部调用。这可能是以下原因之一: 您可能有不匹配的React和渲染器版本(如React DOM) 你可能违反了钩子规则 在同一个应用程序中可能有多个React副本,请参阅有关如何调试和修复此问题的提示。

  • 我第一次面对的问题很小。我试图使用一个简单的useState,但出于某种原因,我不明白为什么React会给我一个错误,不管我想做什么--没有什么能修复它。 这是错误的图像:错误描述: 错误:无效的钩子调用。钩子只能在函数组件的主体内部调用。这可能是由于以下原因之一:1.React和呈现器(例如React DOM)2的版本可能不匹配。你可能违反了钩子3的规则。在同一个应用程序中可能有多个React副

  • 我正努力让你去工作。以下是功能组件: 我称之为: 我得到一个错误,如下所示: 错误:无效的钩子调用。钩子只能在函数组件的主体内部调用。发生这种情况的原因如下:1。React和渲染器(如React DOM)2的版本可能不匹配。你可能违反了Hooks 3的规则。同一应用程序中可能有多个React副本。 我已经调试并确认我使用的是单一版本。也许我使用状态钩子不正确? 这里是我调用自定义钩子的地方:

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