【问题标题】:useEffect() causes infinite loopsuseEffect() 导致无限循环
【发布时间】:2020-11-16 08:54:25
【问题描述】:
React.useEffect (() => {
    if (rows.length === 0) {
        async function fetchMyApi() {
            const url = `https://reqres.in/api/users?page=2`;
            let res = await fetch(url);

            res = await res.json();

            if (res) {
                setRows (res.data);
            }
        }
        fetchMyApi();
    }
}, [rows]);

在 useEffect 中调用 API 会造成无限循环。我试过传递一个空数组,我尝试了所有可能的解决方案,但没有用。

【问题讨论】:

  • [rows] 作为 useEffect 的第二个参数会导致它在每次更改 rows 变量时运行。我假设setRows(res.data); 正在更新该值,这会导致您的循环。
  • 我想将响应设置为 setRows ,可能的方式是什么,应该在页面加载时运行 api 调用
  • 为什么api调用需要rows.length === 0
  • 我用 rows.length === 0 教过可能会停止重新渲染

标签: reactjs react-hooks


【解决方案1】:

您的useEffect 依赖项[rows] 会导致您的useEffect 在您每次调用setRows 时重新触发,这会创建一个无限循环。

const [rows,setRows] = React.useState([]);

const fetchMyApi = React.useCallback(async () => {
        const url = `https://reqres.in/api/users?page=2`;

        let res = await fetch(url);

        res = await res.json();

        if (res){

            setRows (res.data);

        }
}, [setRows]);

React.useEffect (() =>{
    fetchMyApi();
},[fetchMyApi]);

在上面的代码中,useCallback 不是必需的,因为这个函数没有被传递给任何组件。

setRows 应在组件的生命周期内保持不变。

fetchMyApi 将在组件挂载时创建,并且每次 setRows 更改时创建。

useEffect 将在挂载时运行,并且每次 fetchMyApi 更改时都会运行。由于fetchMyApi 永远不会改变useEffect 仅在组件挂载时运行。

【讨论】:

  • 检查https://stackblitz.com/edit/react-gmbpgc console.log 只运行一次。如果可能,请创建一个可重现的示例,以便我们了解您的体验。
  • 在您的表格行上,您有openProfileTab(row),它在渲染时调用该函数。该函数依次调用handleChange,后者又调用setValue,从而导致重新渲染。分配应该类似于onClick={(e) => openProfileTab(e,row)}
  • 我希望您在查看代码时遇到了我的问题,如果您需要更多信息,请告诉我
  • 请注意,当您分配内联函数时,它们会在每次渲染时重新创建,在清理组件时,您应该将 tablerow 视图拆分并使用useCallback 以确保仅在需要时重新创建函数。
猜你喜欢
  • 2020-08-27
  • 2021-11-01
  • 2021-09-27
  • 2020-11-14
  • 1970-01-01
相关资源
最近更新 更多