You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中使用useState与axios无法获取数组数据的问题

问题与修复方案

问题描述

需要从后端返回的如下结构数据中:

[
  {
    "ymd": "2019-01-02",
    "dailyRevenue": 3464
  },
  {
    "ymd": "2019-01-03",
    "dailyRevenue": 3051
  },
  {
    "ymd": "2019-01-04",
    "dailyRevenue": 3495
  },
  {
    "ymd": "2019-01-05",
    "dailyRevenue": 4770
  },
  {
    "ymd": "2019-01-06",
    "dailyRevenue": 4907
  },
  {
    "ymd": "2019-01-07",
    "dailyRevenue": 2880
  }
]

提取ymd字段存入revenueHistoryLabel数组(格式如['2019-03-12', '2019-09-24']),提取dailyRevenue字段存入revenueHistoryData数组(格式如[432,345])。但执行下方代码后,两个数组始终为空:

export default function Dashboard() {
    const API_URL = 'http://localhost:8000/api/';
    const reLabel = ['2019-03-12', '2019-09-24'],       reData = [432,345];
    const [revenueHistoryLabel, setRevenueHistoryLabel] = useState([]);
    const [revenueHistoryData, setRevenueHistoryData] = useState([]);

    useEffect(() => {
        axios.get(API_URL + 'revenues').then((res) => {
            setRevenueHistoryLabel(
                ...revenueHistoryLabel,
                res.data.map((element) => element.ymd),
            );
            setRevenueHistoryData(
                ...revenueHistoryData,
                res.data.map((element) => element.dailyRevenue),
            );
        });
    }, []);

修复方案

问题出在setState的调用方式错误:你把数组元素展开作为参数传递,但setState需要接收的是完整的新状态值,而不是分散的元素。

修正后的代码如下:

export default function Dashboard() {
    const API_URL = 'http://localhost:8000/api/';
    const [revenueHistoryLabel, setRevenueHistoryLabel] = useState([]);
    const [revenueHistoryData, setRevenueHistoryData] = useState([]);

    useEffect(() => {
        axios.get(API_URL + 'revenues').then((res) => {
            // 直接将map返回的数组作为新状态赋值
            setRevenueHistoryLabel(res.data.map(element => element.ymd));
            setRevenueHistoryData(res.data.map(element => element.dailyRevenue));
        });
    }, []);

补充说明

如果后续需要在已有数组基础上追加新数据(而非覆盖),才需要用扩展运算符合并数组,写法应为:

setRevenueHistoryLabel(prev => [...prev, ...newDataLabels]);
setRevenueHistoryData(prev => [...prev, ...newDataValues]);

这里因为是首次请求数据,直接赋值map后的结果即可,无需合并初始空数组。

内容的提问来源于stack exchange,提问作者Khang-Truong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:35:51