【问题标题】:React Useeffect returning null array in firstReact Useeffect首先返回空数组
【发布时间】:2021-07-12 13:23:55
【问题描述】:

我制作了一个 react 项目,在加载数据时,我需要使用 fetch-get 从 json 中获取我的数据。但是,当我这样做时,它首先发送空数组,然后在 1-2 秒后向我发送数据。因此,当它的空数据开始时,我的渲染开始了,所以我的应用程序崩溃了。我怎样才能在没有空数据的情况下做到这一点?我的代码:

const { id } = useParams();
  const [articles, setArticles] = useState([]);
  const [collection, setCollection] = useState([]);

 

     useEffect(() => {
        fetch("http://localhost:3001/api/v1/article/bycollection/" + `${id}`)
          .then((x) => x.json())
          .then((z) => {
            setArticles(z);
          }, []);
        fetch("http://localhost:3001/api/v1/collection/" + `${id}`)
          .then((x) => x.json())
          .then((z) => {
            setCollection(z);
          }, []);
      }, [id]);

空错误行:

return ( 
      <div className="tomiddle ">
          <div className="mb-3">
            <BreadCrumbComp data={breadCrumbData} />
          </div>
    
          <div className="collectionBg">
            <div className="collectionHeader flex">
              <div className="w-32 h-32 p-4 mt-2 text-5xl">
                <i className={collection.icon}></i>
              </div>
              <div>
                <h1 className="collectionTitle ">{collection.name}</h1>
                <WriterGroupInfo groupData={collection} /> // Here i getting error. 
                      Its sending empty collection
              </div>
            </div>)

作家组信息:

const WriterGroupInfo = (props) => {
  const prop = props.groupData;
  console.log("prop=>", props); // Showing empty array.
  const articles = prop.articles.slice(0, 3);
  const last = articles[articles.length - 1];
  const lastAuthor = articles.length > 1 ? " ve " + last.author.name : "";

  const authorNames =
    articles
      .slice(0, 2)
      .map((a) => a.author.name)
      .join(", ") + lastAuthor;

  return (
    
    <div className="flex  pt-4  ">
      <Avatar.Group>
        {articles.map((x) => (
          <Avatar key={x.id} src={x.author.avatar} />
        ))}
      </Avatar.Group>
      <div className="text-collection-small-500 truncate text-xs pl-2 pt-1">
        <span>Bu koleksiyonda {prop.articles.length} makale mevcut</span>
        <br />

        {articles.length > 0 ? (
          <span className="truncate mr-2">
            <span className="text-gray-400 ">Yazarlar: </span>
            {authorNames}
          </span>
        ) : (
          <></>
        )}
      </div>
    </div>
  );
};

【问题讨论】:

  • 你为什么将一个空数组传递给.then?你遇到了什么错误? WriterGroupInfo 组件是什么样的?等等等等。请提供更多数据,我们无法为您提供更多帮助。
  • @JaredSmith 我在哪里传递空数组?我的数据通常不是空的。等等,兄弟,我将为 writergroupinfo 编辑我的问题,抱歉。
  • @JaredSmith 我编辑。请再检查一遍好吗?
  • 您在 fetch 响应处理中传递了一个空数组,这是对 Promise API 的错误使用。
  • @JaredSmith 我实际上不明白我在哪里传递空数据。当我检查像`.then((z) => { console.log(z) // setArticles(z); }, []);` 这样我可以看到我的数据。

标签: javascript node.js reactjs react-native


【解决方案1】:

发生这种情况是因为您将collecion 的第一个值设置为空数组:

const [collection, setCollection] = useState([]);

你应该这样处理这种情况:

return ( 
  <div className="tomiddle ">
      <div className="mb-3">
        <BreadCrumbComp data={breadCrumbData} />
      </div>
     {collection.length === 0 ?
      <div> No data for collection </div> :
      <div className="collectionBg">
        <div className="collectionHeader flex">
          <div className="w-32 h-32 p-4 mt-2 text-5xl">
            <i className={collection.icon}></i>
          </div>
          <div>
            <h1 className="collectionTitle ">{collection.name}</h1>
            <WriterGroupInfo groupData={collection} /> // Here i getting error. 
                  Its sending empty collection
          </div>
        }
        </div>)

【讨论】:

  • 对不起。我是 React 的新手。我确实喜欢这样,但它要求另外返回 1 个参数。所以我给它null。当我的页面加载时,我看不到任何东西,因为它发送空值。 (加载页面时发送空数组,因此它不等待填充数据。所以它为空)
  • 别担心,尝试复制我编写的所有代码,如果问题是您从端点接收 null,您应该使用 @987654324 检查您在请求的 then 中收到的内容@s
【解决方案2】:

您在 useEffect 中的回调有 2 个异步调用,您无需等待它们完成。他们慢慢来。在此之前,下一次渲染已经发生了,因此您的数据会空一段时间,直到您的提取(以及后续的setState)完成。 由于两个 fetch 都是独立的,您可以使用 Promise.allawait 等待它们。

useEffect( () => { 
async yourFunction() {
let promise1 = fetch("http://localhost:3001/api/v1/article/bycollection/" + `${id}`).then((x) => x.json()).then((z) => {
            setArticles(z);
          });
let promise2 = fetch("http://localhost:3001/api/v1/collection/" + `${id}`).then((x) => x.json())
          .then((z) => {
            setCollection(z);
          });

let results = await Promise.all([promise1,promise2]);
}
yourFunction();

}, [id]);

另外,[] 作为第二个then() 的额外参数在我看来不是必需的。

【讨论】:

  • 感谢您的回复,但它仍然是同一个兄弟。它仍然看到第一个空数组。
【解决方案3】:

问题是 UseEffect 异步工作,它在初始渲染后触发。因此,在初始渲染时,它会尝试使用 null/Empty 数组值进行填充。您可以使用 useState 启动传递数组值,例如 const[value,setValue]=useState([]) 。

【讨论】:

  • 如果我错了,我很抱歉,但是我已经使用了 useState 并且它给出了错误兄弟。
  • 兄弟,您只是将整个集合声明为空。 colletion=[] 并尝试访问已声明集合(如 collection.article)中的内部元素。您将一个空数组传递给子元素。并尝试访问不在空元素内的元素。如果你初始化像useState([article=[ firstname = ""] ]) 这样的东西,你会想得到错误。最好的办法是对文章名称和作者使用不同的状态,然后将主题分别传递给子组件。你可以在 useEffect 填充数据时填充它们
猜你喜欢
  • 2021-03-04
  • 2021-07-24
  • 2021-10-28
  • 1970-01-01
  • 2018-11-09
  • 2020-08-18
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多