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

React中双击行触发useState不立即更新,打印API数据为undefined求助

问题分析与解决方案
  • 核心问题:异步操作导致状态未及时更新
    你在调用props.setDetails(data)后立刻执行console.log(props.details),但这两个环节都是异步的:

    1. fetch是异步网络请求,只有等请求完成后,then回调里的setDetails才会执行,而console.log是同步运行的,这时候请求还没返回,setDetails根本没触发。
    2. 就算fetch瞬间拿到数据,useState的更新也是异步批量处理的,不会在调用setDetails后立刻同步更新details的值,所以即时打印也拿不到最新状态。
  • 修正方案

    1. 将console.log放在fetch的then回调内,确保数据返回并触发状态更新后再打印:
      function openWorkOrder(row) {
          const workOrderId = row.data.id
          navigate(`workorder/${workOrderId}`)
          fetch(`baseURL/api/Gages/WorkFlow/GetProductDetailByOrderId?id=${workOrderId}`)
            .then((result) => result.json())
            .then((data) => {
                props.setDetails(data)
                console.log(data) // 直接打印接口返回的最新数据
            })
      }
      
    2. 在父组件监听details状态变化:如果需要确认状态更新后的结果,在父组件中使用useEffect监听:
      // 父组件代码片段
      const [details, setDetails] = useState()
      useEffect(() => {
          if (details) {
              console.log(details) // 当details更新时自动触发
          }
      }, [details])
      
    3. 调整路由跳转时机(可选):如果workorder/:id页面需要依赖details数据渲染,建议等请求完成后再跳转,避免页面加载时数据未就绪:
      function openWorkOrder(row) {
          const workOrderId = row.data.id
          fetch(`baseURL/api/Gages/WorkFlow/GetProductDetailByOrderId?id=${workOrderId}`)
            .then((result) => result.json())
            .then((data) => {
                props.setDetails(data)
                navigate(`workorder/${workOrderId}`) // 请求完成后再执行跳转
            })
      }
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:30:58