【问题标题】:Need help on getting data from API with axios在使用 axios 从 API 获取数据方面需要帮助
【发布时间】:2021-12-17 05:31:17
【问题描述】:

我最近学习了使用 axios 从 REST API 获取数据,但是遇到了一个问题。所以我想从 API 中获取一些数据,这是我的代码:

import {useState, useEffect} from 'react'
import axios from 'axios'
import { Popup, GeoJSON } from 'react-leaflet'
import '../Map.css'

const GradientMap = () => {
 const [data, setData] = useState([]);

 useEffect(()=>{
    getData();
 })
 const getData = async ()=>{
    const response = await axios.get('http://localhost:5000/in-data')
    setData(response.data)
 }

 const getColor = (name)=>{...
 }

 return (
    <div>
        <GeoJSON data={CIKARANG_UTARA} style={{color: getColor(CIKARANG_UTARA.features[0].properties.Name)}}>
            <Popup>
                {CIKARANG_UTARA.features[0].properties.Name} <br/> Total Weight: {data[0].Total_Weight}
            </Popup>
        </GeoJSON>
        <GeoJSON data={CIKARANG_BARAT} style={{color: getColor(CIKARANG_BARAT.features[0].properties.Name)}}>
            <Popup>
                {CIKARANG_BARAT.features[0].properties.Name} <br/> Total Weight: {data[1].Total_Weight}
            </Popup>
        </GeoJSON>
        <GeoJSON data={CIKARANG_TIMUR} style={{color: getColor(CIKARANG_TIMUR.features[0].properties.Name)}}>
            <Popup>
                {CIKARANG_TIMUR.features[0].properties.Name} <br/> Total Weight: {data[2].Total_Weight}
            </Popup>
        </GeoJSON>
        <GeoJSON data={SUKATANI} style={{color: getColor(SUKATANI.features[0].properties.Name)}}>
            <Popup>
                {SUKATANI.features[0].properties.Name} <br/> Total Weight: {data[3].Total_Weight}
            </Popup>
        </GeoJSON>
        <GeoJSON data={CIBITUNG} style={{color: getColor(CIBITUNG.features[0].properties.Name)}}>
            <Popup>
                {CIBITUNG.features[0].properties.Name} <br/> Total Weight: {data[4].Total_Weight}
            </Popup>
        </GeoJSON>
    </div>
 )
}

export default GradientMap

错误在 data[0].Total_Weight 中,当我保存文件时它可以工作,但是在我重新加载浏览器后它变成一个错误,我尝试执行 console.log(data) 并返回一个空数组. API 工作正常,以下是响应:

[
 {
  "Area": "CIKARANG UTARA",
  "Total_Weight": 283,
  "Total_OR_Weight": 135,
  "Total_IN_Weight": 148
 },
 {
  "Area": "CIKARANG BARAT",
  "Total_Weight": 0,
  "Total_OR_Weight": 0,
  "Total_IN_Weight": 0
 },
]

这里是重新加载浏览器前的状态(可以看到,没有报错,总重量获取成功):

这是重新加载浏览器后的情况:

我不知道该怎么办,我是react和axios的新手,提前谢谢

【问题讨论】:

    标签: reactjs axios


    【解决方案1】:

    您正在创建一个空数组:

    const [data, setData] = useState([]);
    

    然后尝试从该空数组中读取第一个值:

    Total Weight: {data[0].Total_Weight}
    

    由于数组为空,所以该数组的第一个元素是undefined

    你可以做的是在数组有值之前有条件地不渲染元素。例如:

    return (
      data.length > 0 ?
      <div>
        ... the rest of your HTML
      </div> :
      <div>Loading...</div>
    );
    

    在获取 API 数据时,您可以将“正在加载”元素替换为您希望在页面上显示的任何内容。但是在获取 API 结果之前,您不能使用,此时更新状态将触发组件重新渲染数据。

    【讨论】:

    • 成功了,非常感谢
    猜你喜欢
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多