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

React中API取数存数组:浏览器刷新与VSCode保存表现差异问题

React刷新页面时控制台输出空数组,热重载后正常的问题解析

问题根源

你遇到的问题核心是React的useState更新是异步操作,且函数组件的state值由当前闭包决定:

  • 在axios请求的回调里,调用setCountry(names)后立刻console.log(country),此时country还是当前函数闭包中的旧值(也就是初始的空数组[])——setState不会立刻同步更新state。
  • 热重载时组件会重新渲染,浏览器控制台对数组这类引用类型的日志存在“延迟展开”特性(展开时显示最新值),导致你误以为打印的是更新后的state,但实际上那个console.log执行时拿到的依然是旧state。

解决方法

方法1:监听state变化打印最新值

用额外的useEffect监听country的变化,每当state更新时自动打印最新值:

const [country, setCountry] = useState([]);
    
useEffect(() => {
  axios.get("https://restcountries.com/v3.1/all")
    .then((response) => {
      const data = response.data;
      const names = data.map((n) => n.name.common);
      setCountry(names);
    })
    .catch((error) => {
      console.log(error);
    });
}, []);

// 监听country变化,打印最新值
useEffect(() => {
  console.log(country);
}, [country]);

方法2:直接打印待设置的新值

如果只是要确认请求返回的数据处理是否正确,直接打印处理后的names即可——这是你要设置给state的最新数据,不存在异步问题:

axios.get("https://restcountries.com/v3.1/all")
  .then((response) => {
    const data = response.data;
    const names = data.map((n) => n.name.common);
    setCountry(names);
    console.log(names); // 直接打印处理后的新数据
  })
  .catch((error) => {
    console.log(error);
  });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 01:13:02