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

React通过axios获取数据存入state时数据不全是什么原因?

问题根因

1. 闭包捕获旧state值

你在getCartItems函数里引用的abc是函数初始化时捕获的初始值[],循环调用setAbc的时候,每次展开的都是初始的空数组,而不是上一次更新后最新的abc值。相当于两次执行的逻辑是setAbc([...[], 32])、setAbc([...[], 24]),最后一次执行直接覆盖了前面的结果,最终abc就只剩[24]。

2. 不必要的循环调用setState

你用map做遍历操作本身也不符合规范,map是用来生成新数组的方法,纯遍历应该用forEach,且循环调用setState会触发多次不必要的重渲染。


修复方案

方案1:使用setState函数式更新(适用于需要逐次更新的场景)

函数式更新可以拿到上一次最新的state值,不会受闭包影响:

const getCartItems = async () => {
  // 这里可以直接解构拿data,不需要额外写then
  const { data } = await CartApi.get(`/${store.getState().auth.user.id}/`);
  console.log('data =>', data)
  data.forEach(a => setAbc(prevAbc => [...prevAbc, a.item]))
}

方案2:批量处理后一次性更新state(更推荐)

先提取所有item字段生成目标数组,再一次性赋值给state,性能更好也不会有闭包问题:

const getCartItems = async () => {
  const { data } = await CartApi.get(`/${store.getState().auth.user.id}/`);
  console.log('data =>', data)
  const itemList = data.map(a => a.item)
  setAbc(itemList)
}

额外优化提示

如果你的项目开启了React Hooks的lint校验,会提示你需要把getCartItems加入useEffect的依赖数组,你可以把函数移动到useEffect内部避免额外的依赖处理:

const [abc, setAbc] = useState([]);

useEffect(() => {
  const getCartItems = async () => {
    const { data } = await CartApi.get(`/${store.getState().auth.user.id}/`);
    const itemList = data.map(a => a.item)
    setAbc(itemList)
  }
  getCartItems();
}, []);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:18:00