处理GreatFrontEnd从作业(job)api获取数据的问题,首先我必须获取id,然后映射id以返回作业(job)对象的array.我有一个问题,什么都不会显示,但当我改变代码中的一些小东西,如删除和添加回括号(我相信这模拟了编辑器中的重新渲染),数据将显示.

import React, { useState, useEffect } from 'react';

export default function App() {
  const [jobsIds, setJobIds] = useState(null);
  const [jobs, setJobs] = useState([]);
  const [loading, setLoading] = useState(false);

  useEffect(() => {
    getJobs();
    console.log(jobs)
}, []);

 

  const getJobIds = async () => {
     try {
      const idRes = await fetch(说https://hacker-news.firebaseio.com/v0/jobstories.json说);
      const jobIds = await idRes.json();
      setJobIds(jobIds);
    } catch (error) {
      console.error('Error fetching job IDs:', error);
    }
  }

  const getJobs = async () => {
    await getJobIds()
    
    try {
      setLoading(true);
      const jobsData = await Promise.all(
        jobsIds.map(async (id) => {
          const jobRes = await fetch(说https://hacker-news.firebaseio.com/v0/item/${id}.json说);
          return await jobRes.json();
          
        })
       
      );
        setJobs(jobsData)
     
      setLoading(false);
    } catch (error) {
      console.error('Error fetching jobs:', error);
      setLoading(false);
    }
  };

  return (
    <>
    {loading? <p> Loading.... </p>: jobs.map((job) =>(
      <p> {job.title} </p>
  ))}
    </>
  );
}

早些时候,我试着把每个fetch函数放在自己的use effect hook中,它工作了,但我试图清理代码,使它更简洁.

推荐答案

我正在判断您的代码并修复问题并更新您的代码. 请将您的代码替换为此.

import React, { useState, useEffect } from 'react';

export default function App() {
  const [jobs, setJobs] = useState([]);
  const [loading, setLoading] = useState(false);

  useEffect(() => {
    getJobs();
    console.log(jobs)
}, []);

 

  const getJobIds = async () => {
     try {
      const idRes = await fetch(`https://hacker-news.firebaseio.com/v0/jobstories.json`);
      const jobIds = await idRes.json();
      console.log('jobIds', jobIds); 
      return jobIds
    } catch (error) {
      console.error('Error fetching job IDs:', error);
    }
  }

  const getJobs = async () => {
    const jobIds = await getJobIds();
    if(jobIds){
      try {
        setLoading(true);
        const jobsData = await Promise.all(
          jobIds?.map(async (id) => {
            const jobRes = await fetch(`https://hacker-news.firebaseio.com/v0/item/${id}.json`);
            return await jobRes.json();
            
          })
         
        );
          setJobs(jobsData)
       
        setLoading(false);
      } catch (error) {
        console.error('Error fetching jobs:', error);
        setLoading(false);
      }
    }
    
  };

  return (
    <>
    {loading? <p> Loading.... </p>: jobs?.map((job) =>(
      <p key={job?.id}> {job?.title} </p>
  ))}
    </>
  );
}

Note 您同时设置这个setJobIds状态,并在同一时间调用它. 第二次数据是因为时间数据已经设置在状态.

Javascript相关问答推荐

在HTML中使用脚本变量作为背景图像源

基于每个索引迭代嵌套对象

如何在JavaScript中通过一次单击即可举办多个活动

窗口.getComputedStyle()在MutationObserver中不起作用

django无法解析余数:[0] from carray[0]'

如何在Angular中插入动态组件

如何解决chrome—extension代码中的错误,它会实时覆盖google—meet的面部图像?'

切换时排序对象数组,切换不起作用

如何用拉威尔惯性Vue依赖下拉?

显示图—如何在图例项上添加删除线效果?

Angular 中的类型错误上不存在获取属性

变量的值在Reaction组件中的Try-Catch语句之外丢失

Reaction Native中的范围滑块

将数组扩展到对象中

按什么顺序接收`storage`事件?

如何访问此数组中的值?

FileReader()不能处理Firefox和GiB文件

JavaScript将字符串数字转换为整数

react 路由DOM有条件地呈现元素

我想为我的Reaction项目在画布上加载图像/视频,图像正在工作,但视频没有