Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 反应状态无限重渲染器_Reactjs - Fatal编程技术网

Reactjs 反应状态无限重渲染器

Reactjs 反应状态无限重渲染器,reactjs,Reactjs,这样一个简单的代码片段会导致无限循环。如果这种方法显然不起作用,我如何使用道具来决定是否应该更新状态 import React from "react"; export default function Igor_test(props) { const { update_name } = props; const [values, setValues] = React.useState({ name: 'Joe', age: 15, }); if (upda

这样一个简单的代码片段会导致无限循环。如果这种方法显然不起作用,我如何使用道具来决定是否应该更新状态

import React from "react";

export default function Igor_test(props) {

  const { update_name } = props;
  const [values, setValues] = React.useState({
    name: 'Joe',
    age: 15,
  });

  if (update_name) {
    setValues(oldValues =>({
      ...oldValues,
      [values.name]: 'Pat',
    }))
  }

  return(
    <div>
      <p>
        {values.name}
      </p>
    </div>
  )

}
错误:重新渲染过多。React将渲染数量限制为 防止无限循环


您可以将所有逻辑放在useEffect挂钩中,以控制何时更新状态 请注意,每次更新名称更改时,此函数都将重新加载


错误是因为您的if条件

if (update_name) {
    setValues(oldValues =>({
      ...oldValues,
      [values.name]: 'Pat',
    }))
}
在这里,如果条件是设置状态,则组件将重新渲染。当您的组件重新呈现时,它将再次检查if条件,并找到update_name的值,再次设置state等等

这导致了无限循环

setValues中还有一个问题,您试图设置[values.name],这是错误的,它应该只是名称

您需要的是带有依赖关系数组的useEffect挂钩,它将跟踪提供的参数,并在参数更改时作出反应

现在,每当update_name更改时,它都会检查它是否有值并相应地设置状态

React.useEffect(() => {
  if (update_name) {
    setValues(oldValues =>({
      ...oldValues,
      name: 'Pat',     //ideally instead of hard coding new name you should use `update_name` passed as props.
    }))
  }
},[update_name])

问题是“update_name”每次返回什么。因为如果它总是有一个真实的值,那么你会得到一个无限循环,因为你触发了setValues,这会导致一个rerenderAlso[values.name]:“Pat”看起来很可疑。update_name,实际上要么是null,要么是对象-如果是对象,我想更新一次状态。与基于类的组件的方法非常相似,似乎工作得相当好。嗨,Bishonen_PL,检查我的解决方案,并让我知道这是否有帮助。
React.useEffect(() => {
  if (update_name) {
    setValues(oldValues =>({
      ...oldValues,
      name: 'Pat',     //ideally instead of hard coding new name you should use `update_name` passed as props.
    }))
  }
},[update_name])