在函数调用上反应无限循环

Posted

技术标签:

【中文标题】在函数调用上反应无限循环【英文标题】:React infity loop on function call 【发布时间】:2020-12-09 03:23:41 【问题描述】:

我有一个(当然)愚蠢的问题。

我的函数 getDataTbable 在无限循环中被调用我不明白为什么......所以请求是不定式调用的。

    export const TableResearch = (setSelectedSuggestion,setImages) => 
const [research, setResearch] = useState('');
const [suggestions, setSuggestions] = useState ([]);
const [table, setTable]= useState ([]);


const getDataTable = async () => 
  const data = await jsonbin.get('/b/5f3d58e44d93991036184474');
  setTable(data);
  console.log(table)
;
getDataTable();

【问题讨论】:

Ciao,但是您想在组件安装时只调用一次getDataTable(); 对吗? 是的,BARNOWL 解决了我在 cmets 中的问题 【参考方案1】:

那是因为TableResearch 函数被多次调用(每次渲染这个组件时)。如果您只想在安装组件时运行函数,则必须使用useEffect。这是一个例子:

useEffect(() => 
  const data = await jsonbin.get('/b/5f3d58e44d93991036184474');
  setTable(data);
, []);

传递给useEffect的第二个参数[]很重要。它使函数只运行一次。

您可以通过HERE了解更多关于useEffect的信息

【讨论】:

【参考方案2】:

每次更改状态时组件都会重新渲染 (setTable)。

您应该使用useEffect 仅在第一次呈现时执行您的函数。

您也可能会遇到此警告:

警告:无法对未安装的组件执行 React 状态更新。

如果在组件卸载后异步调用完成。考虑到这一点,请像这样写useEffect

// outside component
const getDataTable = async () => 
    const  data  = await jsonbin.get("/b/5f3d58e44d93991036184474");
    
    return data;
;

useEffect(() => 
    let mounted = true;

    getDataTable()
        .then(data => 
            if (!mounted) return;
            setTable(data);
        );

    return () => 
        mounted = false;
    ;
, []);

【讨论】:

【参考方案3】:

你可以试试这个

useEffect(() => 
  const getDataTable = async () => 
    const  data  = await jsonbin.get("/b/5f3d58e44d93991036184474");
    setTable(data);
    console.log(table);
  ;

  getDataTable();
, []); // [] makes it runs once 

【讨论】:

我之前尝试过同样的方法并抛出 React Hook useEffect 缺少依赖项,但现在它已修复,我想我错过了一些东西!谢谢 @Jildo 如果这对您有帮助,您可以标记为答案吗?\【参考方案4】:

是的,每次呈现视图时都会执行getDataTable();,包括返回数据时。

尝试像这样包装getDataTable()

if (!table.length) 
  getDataTable()

但是你需要处理如果请求没有返回结果的情况,在这种情况下它仍然会无限运行:

const [table, setTable]= useState([]);
const [loading, setLoading]= useState();

const getDataTable = async () => 
  setLoading(true);
  const data = await jsonbin.get('/b/5f3d58e44d93991036184474');
  setTable(data);
  setLoading(false);
;

if (typeof loading === 'undefined' && !table.length) 
  getDataTable();

【讨论】:

以上是关于在函数调用上反应无限循环的主要内容,如果未能解决你的问题,请参考以下文章

从 api 获取时反应 useEffect 无限循环

如何在反应原生渲染中以无限循环返回数组项视图?

使用 useEffect 反应 axios 获取请求而不会导致无限循环

React:在 useEffect 中调用上下文函数时防止无限循环

Flatlist onEndReached 无限循环

使用 async/await 进行续集查询的无限循环