javascript - 为什么即使未单击按钮,子组件 onclick 中的设置状态也会导致递归循环?

标签 javascript reactjs

我试图理解为什么当我尝试在子组件按钮的 onclick 事件上设置状态时它会导致递归循环。

例如这段代码会产生错误:

import React, { useState } from "react";

export default function App() {
  const [formState, setFormState] = useState({ name: "Joe" });

  return (
    <div className="App">
      <Child state={formState} setState={setFormState} />
    </div>
  );
}

function Child({ state, setState }) {
  return (
    <div className="">
      <h1>Name:{state.name}</h1>
      <button onClick={setState({ name: "Bill" })}>Next</button>
    </div>
  );
}

Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.

此错误发生在没有单击按钮的情况下进行渲染。它怎么会在没有发送点击的情况下导致编译递归?我不明白这是怎么回事。

如果我像这样使用箭头函数,就会出现错误:

function Child({ state, setState }) {
  return (
    <div className="">
      <h1>Name:{state.name}</h1>
      <button onClick={() => setState({ name: "Bill" })}>Next</button>
    </div>
  );
}

我有点理解箭头函数改变了this,但这里发生的事情的细节是在暗示我。

谁能告诉我:

  1. 为什么不带箭头调用会导致递归循环?
  2. arrow 如何修复它?

最佳答案

在这条线上

<button onClick={setState({ name: "Bill" })}>Next</button>

您认为您正在做的是将带有参数 {name: "Bill"}setState 分配给元素的 onClick 处理程序。事实并非如此。

您实际上在做的是调用 setState 函数 渲染期间,这会更改状态并导致重新渲染。在重新渲染中,调用 setState 更改状态并导致重新渲染;在重新渲染中,调用 setState

使用 onClick={()=> {setState({name:"Bill"})} 创建箭头函数并将其分配给 onClick 处理程序。单击元素时,箭头函数会执行,并在内部调用 setState。

关于javascript - 为什么即使未单击按钮,子组件 onclick 中的设置状态也会导致递归循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64626366/

相关文章:

javascript - 使用 Web Api Controller 参数映射 AngularJs 查询字符串

javascript - Gulp Rev 不在我的 list 文件中包含路径

javascript - 如何为 react 中的多个字段制作动态状态?

javascript - 如何在react js的输入标签中获取以逗号分隔的输入数组

ios - ReactJs PWA 未在 iOS 上更新

javascript - 如何将参数传递给 react 中的事件监听器

javascript - Vue.js : How to use a computed property to modify string and apply dynamically as CSS class

javascript - 路线正在下载页面而不是显示它

javascript - Froala 编辑器 - 自定义对话框

html - 使侧边栏(在 React 中)即使在滚动时也占据页面高度的 100%