React useState 钩子无限期运行 - 无限循环

我有一个简单的反应功能组件。

代码应该是不言自明的。如果状态等于'some status',则转到一个 URL,获取一些信息,并将组件的状态设置为已获取的信息。在return()上只显示信息。一切正常,显示数据的 id。但是,当我打开开发工具并进行检查时,console.log("data"+data.id);无限期运行。我想知道是什么让它无限期地运行。

如果我从提取中删除更改数据(数据),console.log 不会无限期运行。

我正在摸不着头脑,为什么改变状态会使代码进入无限循环?

function ReturnInfo(props) {
var currentstatus = props.currentstatus; // receiving the current status as prop from parent.

const [data,changeData] = useState({});
let { slug } = useParams(); // getting the slug.


if (currentstatus == 'some status') {
    fetch(`https:someurl/${slug}`).
        then(res => res.json()).
        then(data => {
            console.log("data" + data.id);
            changeData(data);
        });



    return (
        <div>
            <div>
                {data.id}
            </div>
        </div>
    )
}


else {
    return (
        <p>try harder!</p>
    )
}

}

zhuangwei519 回答:React useState 钩子无限期运行 - 无限循环

您每次渲染组件时都会调用该函数。该函数被调用,它更新状态,并使组件重新渲染。

您应该在事件发生时调用该函数或在每次执行块时更改 currentstatus 值。

,

changeData(data) 将导致重新评估组件。导致再次调用fetch,导致无限循环。

useEffect(() {
if (currentstatus == 'some status') {
fetch(`https:someurl/${slug}`).
    then(res => res.json()).
    then(data => {
        console.log("data" + data.id);
        changeData(data);
    });

}},[])

,

你应该使用 useEffect,Effect Hook 可以让你在函数组件中执行副作用: useEffect 文档 = https://reactjs.org/docs/hooks-effect.html

如果您不添加依赖项数组,它将在每次更新时运行。 简单地将您的副作用/异步任务代码包装在 useEffect 函数中。 并添加依赖数组。如果只想运行一次,请添加空数组。

 useEffect(() => {
 fetch(`https:someurl/${slug}`).
        then(res => res.json()).
        then(data => {
            console.log("data" + data.id);
            changeData(data);
        });
    },[slug])
   

它将停止不必要的重新渲染。

编辑试试这个

function ReturnInfo(props) {
var currentstatus = props.currentstatus; // receiving the current status as prop from parent.

const [data,changeData] = useState({});
let { slug } = useParams(); // getting the slug.


useEffect(() => {
 fetch(`https:someurl/${slug}`).
        then(res => res.json()).
        then(data => {
            console.log("data" + data.id);
            changeData(data);
        });
},[slug])

if (currentstatus === 'some status') {
   return (
        <div>
            <div>
                {data.id}
            </div>
        </div>
    )
} 
    return <p>try harder!</p>
}

本文链接:https://www.f2er.com/10525.html

大家都在问