【问题标题】:ReactJS fetch data from api json fileReactJS 从 api json 文件中获取数据
【发布时间】:2020-06-04 22:59:47
【问题描述】:

我正在尝试从此 api 访问数据。当它像以下格式时,我知道如何访问它的数据

{
  "confirmed": {
      "value": 6429453,
      "detail": "https://covid19.mathdro.id/api/confirmed"
},
  "recovered": {
      "value": 2804649,
      "detail": "https://covid19.mathdro.id/api/recovered"
},
  "deaths": {
      "value": 385873,
      "detail": "https://covid19.mathdro.id/api/deaths"
},

我会这样做

try {
    const {/* data: {confirmed, recovered, deaths, lastUpdate}} = await axios.get(url); */

      data: { confirmed, recovered, deaths, lastUpdate },
    } = await axios.get(changeableUrl); 

    const modifiedData = { 
        confirmed, 
        recovered, 
        deaths, 
        lastUpdate
     };

    return modifiedData;
    /* return response; */
  } catch (error) {
    console.log(error);
  }
};

但是当我试图访问统计数据所在的数据时,它不起作用,它是 嵌套 json 对象,

 [
    {
       "country": "US",
       "province": "Louisiana",
       "county": "Acadia",
       "updatedAt": "2020-06-03 02:33:13",
       **"stats": {
          "confirmed": 428,
          "deaths": 24,
          "recovered": 0
        },**
       "coordinates": {
          "latitude": "30.2950649",
          "longitude": "-92.41419698"
       }
   }
]

我尝试以下方法:

if (county) {   
        changeableUrl = `${url}/jhucsse/counties/${county}`;
        try{
            const {data:{updatedAt, stats:{confirmed, deaths, recovered}}} = await axios.get(changeableUrl);
            const modifiedData = {
                cases: confirmed,
                deaths,
                recovered,
                updated: updatedAt
            }
            console.log(modifiedData);
            return modifiedData;
        }catch(error){
            console.log(error);
        }
    }

有没有更好的方法来访问 api 数据?提前谢谢!

编辑: CodeSandbox 链接在这里:https://codesandbox.io/s/pickers-l6mip?file=/src/component/statepicker.jsx

更新工作代码:

 if (county) {
    try {
      const { data } = await axios.get(`${url}/jhucsse/counties/${county}`);
      const modifiedData = {
        cases: data[0].stats.confirmed,
        recovered: data[0].stats.recovered,
        deaths: data[0].stats.deaths
      };

【问题讨论】:

  • 我已经多次阅读您的问题,但我真的很难理解您在问什么。您是否获得了预期的数据?这个问题是关于如何使用解构重新格式化数据?来自 api 调用的原始响应数据是什么样的?
  • 如果您显示完整内容,json 看起来格式不正确
  • @Xesenix 这是一个链接,指向它在网页ibb.co/kg8d4fN控制台中的显示方式,谢谢!如果需要进一步说明,请告诉我!
  • data 是一个对象数组,而不是您尝试从中解构 stats 属性的对象
  • @SethLutske 谢谢,很抱歉造成混乱,我无法取回数据,因为我不知道如何访问“统计数据”的数据。我可以使用 const {data} = await axios.get(${url}/jhucsse/counties/${county}); 访问完整数据;我还可以使用以下代码获取国家/地区 County updatedAt 信息 const modifiedData = data.map((fetchedCounty) => ({ country: fetchedCounty.country, County: fetchedCounty.county })) 但我就是无法获得从“统计”中确认恢复等谢谢您的回答!

标签: reactjs


【解决方案1】:

您必须注意,您正在从 API 接收一个数组,因此您需要从第一个对象获取 stats 值。

您应该只需要访问返回的数据数组中的第一个对象,因为您正在专门查询 1 个县或 1 个州,因此预期输出不应包含多个对象

此外,当您进行查询时,您必须将州或县变量作为对象而不是直接值传递,否则您将无法区分要查询的 API

更新后的 fetchUSData 方法如下所示

export const fetchUSData = async ({ county, state } = {}) => {
  /* let changeableUrl = `${url}/countries/USA`; */
  if (county) {
    try {
      const { data } = await axios.get(`${url}/jhucsse/counties/${county}`);
      const modifiedData = {
        stats: data[0].stats
      };

      /* return stats.map((confirmed) => confirmed.value); */
      return modifiedData;
    } catch (error) {
      console.log(error);
    }
  } else if (state) {
    try {
      const { data } = await axios.get(`${url}/jhucsse/counties/${county}`);

      const modifiedData = {
        stats: data[0].stats
        /* updated: updatedAt, */
      };
      return modifiedData;
    } catch (error) {
      console.log(error);
    }
  }
}

还要注意你声明查询,你需要更新你的API端点,它似乎指向县

Working Demo

【讨论】:

  • 我可以通过您的示例移动一些代码来获得确认、死亡和恢复的值。谢谢! if (county) { try { const { data } = await axios.get(${url}/jhucsse/counties/${county}); const modifiedData = { 案例:数据[0].stats.confirmed,恢复:数据[0].stats.recovered,死亡:数据[0].stats.deaths };
【解决方案2】:

所以在查看your codepen 之后,您的函数fetchCounty 应该如下所示(在api/index.js 中):

export const fetchCounty = async () => {
  try {
    const { data } = await axios.get(`${url}/jhucsse/counties`);
    const modifiedData = data.map(fetchedCounty => ({
      county: fetchedCounty.county,
      province: fetchedCounty.province,
      stats: fetchedCounty.stats,
    }));

    return modifiedData;
  } catch (error) {
    console.log(error);
  }
};

因此,您还将传递每个县的统计数据。

【讨论】:

  • 感谢您的回复,我在我的 api.js 中执行此操作,我确实在我的 picker.jsx 中使用了 useEffect,就像在下面的 img url ibb.co/dMdPWVr 中我将如何访问结构化的数据喜欢下面的 img ibb.co/kg8d4fN 谢谢你,很抱歉有这么多问题
  • 没问题,虽然我不知道我是如何被否决的,但没关系。在任何情况下,您都可以通过它们的属性名称访问每个对象,例如 stats.confirmed,它是每个 fetchedCounty 内部对象 stats 的属性。
  • @Rafel Rocha 它能够返回它,但值变得未定义
  • 你能用你的代码创建一个codesandbox吗?也许能够更好地弄清楚发生了什么。
猜你喜欢
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-30
  • 1970-01-01
  • 2019-03-25
  • 2016-11-27
  • 2019-10-02
相关资源
最近更新 更多