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

React中使用Axios响应数据设置useState状态为空如何解决

问题原因与解决方案

1. 最常见原因:React状态更新的异步特性

React的setState(包括useState返回的更新方法)是异步批量执行的,你调用setDataTemp后,当前函数作用域内的dataTemp仍然是本次渲染周期的旧值,不会立刻更新为新状态。你在finally块中打印拿到的初始空数组属于正常现象,不代表状态更新失败。

2. 验证状态是否正常更新

不要在请求的回调函数内打印状态验证更新结果,单独加一个副作用监听dataTemp的变化即可确认:

// 放在组件顶层,和useState同级
useEffect(() => {
  console.log('dataTemp 已更新为:', dataTemp)
}, [dataTemp])

如果这里可以正常打印出接口返回的数组,说明你的状态更新逻辑本身没有问题。

3. 潜在问题:引用类型修改异常

你当前代码中调用的removeRootUUID如果是原地修改传入数组的方法,可能会因为引用指向问题导致不可预期的状态异常,建议调整为拷贝后处理的逻辑:

await axios
  .get(network + '/getOverlayList', {
    cancelToken: source.token,
  })
  .then(response => {
    // 先拷贝原数组再处理,避免修改接口响应的原始引用
    const itemsCopy = [...response.data.items]
    removeRootUUID(itemsCopy, itemsCopy);
    return {
      ...response.data,
      items: itemsCopy
    };
  })
  .then(response => {
    // 可以加一行打印确认传入setDataTemp的值是否正常
    // console.log('待更新的items:', response.items)
    setDataTemp(response.items);
  })

如果removeRootUUID是返回处理后新数组的纯函数,注意要接收返回值,不要调用后直接丢弃:

.then(response => {
  const processedItems = removeRootUUID([...response.data.items], [...response.data.items]);
  return {
    ...response.data,
    items: processedItems
  };
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:36:03