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

React中useState合并两个数组失效问题求助

React状态合并失败问题解决

问题场景

你通过React的useState声明了数组状态:

const [pending, setPending] = useState([]);

随后发起两个并行API请求,尝试将返回的数组数据合并到pending中,但操作后状态未正确累加,还出现了报错,待合并的是两个结构相似的用户数据数组。

核心原因

两个API请求是异步并行执行的,回调函数中捕获的pending是组件初始渲染时的空数组。当两个回调依次执行时,后执行的更新会直接基于空数组+自身数据覆盖前一个更新的结果,而非在最新状态上累加;同时如果接口返回数据格式不符合预期(比如非数组),也会触发展开操作的报错。

解决方法

方法1:使用函数式更新保证状态最新

将setPending改为函数式更新,每次更新都基于最新的状态值,同时添加数据格式校验:

api.request('/api/director-user', 'GET')
  .then(res => {
    if (res.status === 200 || res.status === 201) {
      // 用prev获取最新的pending状态,同时校验数据是否为数组
      setPending(prev => [...prev, ...(Array.isArray(res.data.data) ? res.data.data : [])]);
    }
  })

api.request('/api/company-user', 'GET')
  .then(res => {
    if (res.status === 200 || res.status === 201) {
      setPending(prev => [...prev, ...(Array.isArray(res.data.data) ? res.data.data : [])]);
    }
  })

方法2:合并并行请求统一更新(可选)

如果希望两个请求都完成后再一次性更新状态,用Promise.all合并请求,减少状态更新次数:

Promise.all([
  api.request('/api/director-user', 'GET'),
  api.request('/api/company-user', 'GET')
]).then(results => {
  const combinedData = results.reduce((total, res) => {
    if (res.status === 200 || res.status === 201) {
      // 只合并合法的数组数据
      return total.concat(Array.isArray(res.data.data) ? res.data.data : []);
    }
    return total;
  }, []);
  setPending(combinedData);
})

关键提示

  • 函数式更新是React处理异步状态更新的常规方案,能彻底避免闭包导致的旧状态捕获问题。
  • 添加Array.isArray校验是为了兼容接口返回非数组的异常情况,避免报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:00:36