You need to enable JavaScript to run this app. 在map循环中调用React setState仅保留最后一条数据如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

在map循环中调用React setState仅保留最后一条数据如何解决?

问题根因

React 的 useState 更新方法是异步的,同一渲染周期内多次调用时会捕获当前作用域的状态快照。你在循环中每次调用 setDataSource 时,读取的都是 useEffect 初始化时的空数组 dataSource,每次更新都会覆盖前一次未生效的更新,最终仅保留最后一条数据。

最优解决方案

不要在循环内多次触发状态更新,先批量处理完所有数据后一次性更新状态即可:

const [dataSource, setDataSource] = React.useState([]);
React.useEffect(() => {
  const processedList = orders.map((item, index) => ({
    key: index,
    id: helpers.leftPad(item.oid, 6, 0),
    name: item.cname,
    totalPrice: item.total_price === null ? 'No data' : item.total_price,
    orderDate: item.order_date
  }))
  setDataSource(processedList)
}, [])

补充说明

如果确实有逐次更新状态的特殊需求,可以使用 setState 的函数式更新形式,通过回调参数获取上一次的最新状态,避免读取到旧的状态快照:

// 仅做原理演示,该写法性能不如一次性批量更新
React.useEffect(() => {
  orders.forEach((item, index) => {
    setDataSource(prevState => [
      ...prevState,
      {
        key: index,
        id: helpers.leftPad(item.oid, 6, 0),
        name: item.cname,
        totalPrice: item.total_price === null ? 'No data' : item.total_price,
        orderDate: item.order_date
      }
    ])
  })
}, [])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 18:54:00