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

React-Query GET请求成功但data为undefined无法渲染数据

问题原因与修复方案

接口请求成功但React Query返回的data为undefined,是代码笔误+React生命周期用法错误共同导致的,按以下顺序排查修复:

  • 核心笔误:axios调用语法错误,导致query函数未正确返回数据
    自定义hook中的axios请求部分存在两个直接影响运行的问题:

    1. axiosInstance.get<ResultWrapper<FinancialData[]>> 泛型闭合后多打了一个多余的英文.,相当于尝试访问get方法的不存在属性后再做调用,会直接触发JS运行时错误,query函数执行失败,无法把返回值同步给React Query状态
    2. 单引号包裹的请求URL被直接折行,JS中普通单/双引号字符串不支持直接换行,会触发语法错误;如果是粘贴代码导致的格式折行,也要检查实际代码中URL是否被意外插入了换行、多余空格,导致返回数据不符合预期

    修复后的hook请求逻辑如下,建议先把响应赋值给变量再返回,避免链式调用的括号/点写错位置:

    const useGetFinancialData = (
      options: UseQueryOptions<FinancialData[], string> = {}
    ): UseQueryResult<FinancialData[], string> =>
      useQuery<FinancialData[], string>(
        useGetFinancialDataKey,
        async () => {
          const res = await axiosInstance.get<ResultWrapper<FinancialData[]>>(
            'https://financialmodelingprep.com/api/v3/search?query=AA&limit=10&exchange=NASDAQ&apikey=ENTERAPIKEY'
          )
          // 调试时可打开下面这行,确认返回结构是否符合预期
          // console.log('接口原始响应:', res)
          return res.data.result
        }, 
        options
      );
    
  • 生命周期用法错误:渲染阶段调用状态更新函数,导致渲染循环中断
    你在useMemo回调中直接调用了setPage(0),useMemo是组件渲染过程中同步执行的逻辑,渲染阶段调用状态setter会立即触发新一轮重渲染,严重时会触发无限重渲染循环,导致React中断渲染流程,数据无法正常映射到视图。
    页码重置逻辑应该放到useEffect中,监听搜索词变化触发:

    // 搜索词变化时重置页码,不要写在useMemo里
    useEffect(() => {
      setPage(0)
    }, [searched])
    
    const filteredRows = useMemo(() => {
      const query = searched.toLowerCase();
      return financialData?.filter(
        (item) => item.name.toLowerCase().includes(query)
      );
    }, [searched, financialData]);
    
  • 缺失状态兜底逻辑,未捕获请求异常
    React Query在请求第一次加载、执行报错时,data的默认值就是undefined,你目前只解构了data字段,没有处理加载、错误状态,也没有打印错误信息,很难定位问题。建议补充状态判断:

    const { data: financialData, isLoading, error } = useGetFinancialData();
    
    // 调试用,可直接看到query的全量状态
    console.log('Query状态:', { financialData, isLoading, error })
    
    if (isLoading) return <div>数据加载中...</div>
    if (error) return <div>加载失败:{error}</div>
    
  • 类型定义优化(不影响运行,建议调整)
    你定义的FinancialData接口中包含了前端组件用的handleViewData回调字段,这个字段不是接口返回的内容,容易造成类型误导。建议拆分接口返回类型和组件Props类型:

    // 仅定义接口实际返回的字段
    export interface FinancialData {
      symbol: string;
      name: string;
      stockExchange: string;
      exchangeShortName: string;
      currency: string;
    }
    
    // 表格行组件Props继承接口类型,额外加回调字段
    interface FinancialDataRowProps extends FinancialData {
      handleViewData: () => void
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:48:16