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

Posted

技术标签:

【中文标题】React useState钩子无限期运行 - 无限循环【英文标题】:React useState hook is running indefinitely - infinite loop 【发布时间】:2021-10-05 22:05:11 【问题描述】:

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

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

如果我从 fetch 中删除更改数据(数据),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>
    )

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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);
    );

,[])

【讨论】:

它不起作用。每次遇到 changedata(data) 时,都会调用 useEffect() 并再次陷入无限循环!我已经尝试过您建议的代码。如果console.log的无限循环也有同样的问题 是否在useEffect中提供数据作为依赖?【参考方案3】:

你应该使用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>

【讨论】:

它不起作用。每次遇到 changedata(data) 时,都会调用 useEffect() 并再次陷入无限循环!我已经尝试过您建议的代码。如果console.log无限循环也会有同样的问题。

以上是关于React useState钩子无限期运行 - 无限循环的主要内容,如果未能解决你的问题,请参考以下文章

React:useState 钩子中的 setState 在啥情况下会导致重新渲染?

在对数组进行排序并传递它之后,React 钩子 useState/setState 不起作用

React - useState 钩子第一次和后续设置状态时的奇怪行为

是否可以使用 React 中的 useState() 钩子在组件之间共享状态?

如何在 React 中正确使用 useState 钩子和 typescript?

React 用 useReducer 替换 useState,同时还使用自定义钩子