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

React useState设置fetch返回的新建记录ID不生效问题咨询

问题原因分析
  • Promise链式调用逻辑错误
    你当前的写法将response.json()返回的Promise嵌套在了第一层then的回调内部,且没有主动返回这个Promise,导致外层后续的.then(() => console.log(newID))不会等待内部的接口响应解析逻辑执行完成就提前触发,此时setNewID还未执行,newID自然还是初始值undefined。
  • React useState更新机制的特性
    React的useState返回的状态更新函数是异步执行的,就算你修正了Promise的等待逻辑,在同一个执行上下文中调用setNewID之后,立刻访问newID拿到的还是当前闭包缓存的旧值,更新后的状态要等到组件下一次重渲染之后才可以获取到,所以你在fetch的then链里永远读不到刚更新的newID。
解决方案

你补充提问里的写法完全可行,不需要额外定义newID状态做中转,直接在拿到接口返回的id后调用navigate即可,这是更简洁合理的实现方式。
你也可以把Promise链铺平,减少嵌套提升可读性:

fetch('https://localhost:44326/api/Players/post', {
  method: 'POST',
  headers: {
    Accept: 'application/json',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    handle: data.handle,
    role: data.role,
    avatar: linkToAvatar,
  }),
})
.then(response => response.json())
.then(data => {
  // 直接使用返回的id跳转,不需要额外存状态
  navigate('../Stats/', { state: { userID: data.id } })
})
.catch(err => console.error('请求出错:', err))

如果你确实需要把id存入状态用于其他渲染逻辑,直接在拿到数据后同时执行更新状态和跳转即可,不需要在后续的then中访问状态:

.then(data => {
  setNewID(data.id)
  navigate('../Stats/', { state: { userID: data.id } })
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:24:04