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

React中useState调用Axios后首次打印undefined的解决方法

React状态更新异步问题解决方法

问题原因

React中useState的状态更新是异步操作,调用setArticle后,article变量不会立刻更新为新值。首次点击时,console.log(article)执行时状态还没完成更新,所以输出初始的undefined;第二次点击时,上一次的状态更新已经完成,因此能拿到正确值。

解决方案

方案一:在请求回调内直接处理数据

不需要依赖状态更新,在then回调里直接使用接口返回的数据,这样能立刻拿到最新值:

import { useState } from "react";
import axios from "axios";

const [apiData, setApiData] = useState();
const [article, setArticle] = useState();

const getArticleFromApi = () => {
  axios
    .get(`http://localhost:8080/api/articles/${apiData.brand_id}/${apiData.article_number}`)
    .catch((err) => console.log(err))
    .then((resp) => {
      const newArticle = resp.data.data;
      setArticle(newArticle);
      // 直接在这里处理新数据,无需等待状态更新
      console.log(newArticle);
      // 其他需要使用article的业务逻辑也放在此处
    });
};

方案二:用useEffect监听状态变化

如果需要在article状态更新后执行逻辑,比如渲染后的数据处理,可以使用useEffect监听article的变化:

import { useState, useEffect } from "react";
import axios from "axios";

const [apiData, setApiData] = useState();
const [article, setArticle] = useState();

// 监听article状态变化,更新完成后执行逻辑
useEffect(() => {
  if (article) { // 过滤初始的undefined状态
    console.log(article);
    // 这里写需要依赖最新article的逻辑
  }
}, [article]); // 依赖项数组,只有article变化时才触发

const getArticleFromApi = () => {
  axios
    .get(`http://localhost:8080/api/articles/${apiData.brand_id}/${apiData.article_number}`)
    .catch((err) => console.log(err))
    .then((resp) => {
      setArticle(resp.data.data);
    });
};

注意事项

  • 不要尝试用await直接等待setArticle完成,因为setState本身不返回Promise,无法被await。
  • 模板字符串拼接URL比字符串相加更简洁易读,建议使用${}语法。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:06:27