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

React Query未调用API致data返回undefined,求技术排查

排查@tanstack/react-query未发起请求、data返回undefined的问题

问题核心原因及修复步骤:


1. 违反React Hooks规则,导致useQuery未执行

React Query的useQuery是React钩子,必须直接在React组件或自定义钩子中调用。你的fetchAllTasks是普通函数,不是自定义钩子(自定义钩子命名必须以use开头),调用它时不符合钩子规则,导致useQuery完全没触发,自然不会发起网络请求。

修复:将函数改为自定义钩子
修改task-api.ts:

import { useQuery } from "@tanstack/react-query"
import axios from "axios"
import { Task } from "../types"

// 自定义钩子必须以use开头命名
export const useFetchAllTasks = () => {
    return useQuery({
        queryKey: ['tasks'],
        queryFn: async () => {
            const response = await axios.get('http://localhost:3100/tasks')
            // 修复axios数据获取方式(见下文)
            const data: unknown = response.data
            
            console.log('data: ', data)
            return data as Task[]
        }
    })
}

在task-list.tsx中调用这个钩子:

// 替换原fetchAllTasks的导入
import { useFetchAllTasks } from "../../api/tasks-api"

const TaskList = () => {
    // 调用自定义钩子
    const { data: tasks, isLoading } = useFetchAllTasks()

    console.log('tasklists - fetchAllTasks:', tasks) 

    // 其余渲染代码不变
}

2. axios响应数据获取错误

axios请求返回的response.data是同步属性,不是异步方法,你写的await response.data()会直接抛出错误(因为data不是函数)。改成直接读取属性即可:

// 错误写法
const data: unknown = await response.data()
// 正确写法
const data: unknown = response.data

3. 可选优化:渲染逻辑更清晰

当前的条件判断可以调整,优先处理加载状态,避免逻辑混乱:

return (
    <div className={`${style['TaskList']}`}>
        <ul>
            {isLoading ? (
                <p>加载中...</p>
            ) : tasks?.length === 0 ? (
                <p className={`${style['no-task']}`}>+++ Task List is Empty +++</p>
            ) : (
                tasks?.map((task) =>
                    <TaskItem
                        key={task.id} {/* 建议用task的唯一id作为key,避免toString重复 */}
                        atom={task}
                    />
                )
            )}
        </ul>
    </div>
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 01:42:21