reactjs - 在使用 axios 从 API 获取数据方面需要帮助
问题描述
最近学习了使用 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的新手,提前谢谢
解决方案
您正在创建一个空数组:
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 结果之前,您不能使用它,此时更新状态将触发组件重新渲染数据。
推荐阅读
- javascript - 角度为 2 的三态复选框
- python - 蟒蛇。强制不使用代理
- java - 是否应该使用异常来描述用户输入错误?
- r - 实现正弦波或余弦波(有概率)
- c++ - 如何在动态数组上使用搜索功能?
- javascript - 直接将参数传递给内联的onclick函数
- javascript - SCRIPT5022:IE 11 中的语法错误
- python-3.x - 如何通过计算创建包含数据的表
- python - (Python) Networkx - 如何为具有 pos 变量的节点设置自己的位置
- dialogflow-es - Google DialogFlow 的隐私政策?(GDPR)