【问题标题】:How can I run multiple queries on load of functional component using UseEffect and get result in render method?如何使用 UseEffect 在加载功能组件时运行多个查询并在渲染方法中获取结果?
【发布时间】:2020-10-06 06:03:46
【问题描述】:

我有以下功能组件,在加载组件时,它需要遍历一个数组并运行一些异步查询来填充一个我想在渲染方法中显示的新数组。

     import React, { useEffect, useState, useContext } from 'react';
     import { AccountContext } from '../../../../providers/AccountProvider';
     import { GetRelationTableCount } from '../../../../api/GetData';
     import { getTableAPI } from '../../../../api/tables';

  const RelatedRecordsPanel = (props) => {
  const { userTokenResult } = useContext(AccountContext);
  const { dataItem } = props;

  const [relatedTableItems, setRelatedTableItems] = useState([]);

   useEffect(() => {
      const tempArray = [];
      const schema = `schema_${userTokenResult.zoneId}`;
      const fetchData = async () => {

     return Promise.all(
        dataItem.tableinfo.columns
        .filter((el) => el.uitype === 1)
        .map(async (itm) => {
          const tblinfo = await getTableAPI(itm.source.lookuptableid);
          const tblCount = await GetRelationTableCount(
           dataItem.tableid,
          itm.source.jointable,
          schema,
        );

        const TableIconInfo = { name: tblinfo.name, icon: tblinfo.icon, count: tblCount };
        tempArray.push(TableIconInfo);

      })

  );
};
 fetchData();
setRelatedTableItems(tempArray)
 }, []);

  return (
     <div>
       {relatedTableItems.length > 0 ? <div>{relatedTableItems.name}</div> : null}
  </div>
  );
  };

在上面的代码中,查询运行正确,如果我在循环中执行 console.log,我可以查看是否可以正常获取数据,但是,数组始终是 [] 并且没有数据呈现。如何编写此异步代码以完成查询以填充数组,以便我可以正确呈现?

谢谢!

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    您没有使用 Promise.all 的返回值,并且由于您的所有 API 都是异步的,因此 tempArray 在您希望将其设置为状态时并未填充

    您可以通过等待 Promise.all 结果然后使用响应来更新它,如下所示

    useEffect(() => {
          const schema = `schema_${userTokenResult.zoneId}`;
          const fetchData = async () => {
    
         return Promise.all(
            dataItem.tableinfo.columns
            .filter((el) => el.uitype === 1)
            .map(async (itm) => {
              const tblinfo = await getTableAPI(itm.source.lookuptableid);
              const tblCount = await GetRelationTableCount(
               dataItem.tableid,
              itm.source.jointable,
              schema,
            );
    
            const TableIconInfo = { name: tblinfo.name, icon: tblinfo.icon, count: tblCount };
            return TableIconInfo;
    
          })
    
      );
    };
     fetchData().then((res) => {
         setRelatedTableItems(res);
     });
    
     }, []);
    

    【讨论】:

    • 谢谢,这行得通!我也只是通过更改 useEffect(async () ) 然后使用 await fetchData(); setRelatedTableItems(tempArray) 在最后。
    • 顺便说一句,你不应该使 useEffect 异步,它会给你一个警告。 stackoverflow.com/questions/53332321/…
    猜你喜欢
    • 2020-05-13
    • 2018-03-16
    • 2020-10-29
    • 2020-05-02
    • 2020-01-06
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多