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

React-Query获取数据为undefined引发map读取错误的原因排查

问题原因与解决方案

问题根源

1. 请求未完成时的初始状态

React-Query 在请求发起后、成功返回数据前,data(即你定义的userData)的初始值是undefined。你直接调用userData.map(),自然会触发「无法读取undefined的map属性」错误。

2. 错误处理的遗漏

你的queryFn里用了try/catch,但catch块只打印错误、没有返回任何值。如果请求失败,queryFn会返回undefined,导致userData依然是undefined。


解决方法

1. 给userData设置默认空数组

解构时直接给userData赋默认值,确保无论请求状态如何,它都是可遍历的数组:

const { data: userData = [] } = useQuery(...)

2. 利用React-Query的状态做判断

React-Query 会返回isLoading、error等状态,用这些状态在不同阶段展示对应UI,避免操作未就绪的数据:

  • 加载中时显示提示
  • 出错时显示错误信息
  • 成功时渲染列表

3. 完善错误抛出逻辑

去掉多余的try/catch,改用检查响应状态码抛出错误,让React-Query自动捕获错误到error状态,方便统一处理:

queryFn: async () => {
    const res = await fetch('https://jsonplaceholder.typicode.com/users')
    if (!res.ok) {
        throw new Error('用户数据加载失败')
    }
    return res.json()
}

修改后的完整代码

import React from 'react'
import { useQuery } from '@tanstack/react-query';

const Query = () => {
    const { data: userData = [], isLoading, error } = useQuery({
        queryKey: ["user"], 
        queryFn: async () => {
            const res = await fetch('https://jsonplaceholder.typicode.com/users')
            if (!res.ok) {
                throw new Error('用户数据加载失败')
            }
            return res.json()
        }
    })

    if (isLoading) {
        return <div>加载中...</div>
    }

    if (error) {
        return <div>加载失败:{error.message}</div>
    }

    return (
        <div>
            {userData.map((user) => {
                return <p key={user.id}>{user.name}</p>
            })}
        </div>
    )
}

export default Query

额外说明:给列表元素加上key属性,符合React列表渲染的规范,避免不必要的重渲染。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:35:27