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

React调用dummyapi渲染列表报data/map undefined错误排查

问题根因
  • 数据嵌套取值逻辑错误:useQuery会将请求完成后的完整响应挂载到自身返回的data字段上,而你调用的接口响应结构内又存在一层data字段存储帖子数组,直接对useQuery返回的data调用map方法,实际拿到的是整个接口响应对象而非帖子数组;请求未完成的pending阶段,useQuery返回的data默认值为undefined,此时访问map方法会直接抛出data.map() is undefined报错。
  • 缺失异步状态兜底:请求从发出到返回的过程中组件会先执行一次初始渲染,你没有对加载、错误状态做判断就直接渲染依赖异步返回的数据,必然触发undefined相关报错。
可直接运行的正确实现
import { useQuery } from '@tanstack/react-query';
import axios from 'axios';

// 封装帖子列表请求方法
const fetchPostList = async () => {
  const response = await axios.get('你的dummyapi帖子列表接口地址', {
    headers: {
      'app-id': '替换为你自己的dummyapi应用ID'
    }
  });
  // 提前返回接口中存储帖子数组的data字段,减少后续嵌套取值
  return response.data.data;
};

export default function PostList() {
  // 解构useQuery返回值,将返回的帖子数组重命名为posts,同时取出加载、错误状态
  const {
    data: posts,
    isLoading,
    isError,
    error
  } = useQuery({
    queryKey: ['postList'],
    queryFn: fetchPostList
  });

  // 加载状态兜底渲染
  if (isLoading) {
    return <div>帖子数据加载中...</div>
  }

  // 错误状态兜底渲染
  if (isError) {
    return <div>数据加载失败:{error.message}</div>
  }

  return (
    <div className="post-list-container">
      {/* 此时posts已确定为帖子数组,可安全调用map遍历 */}
      {posts.map((post) => (
        <div className="post-item" key={post.id}>
          <p>帖子ID:{post.id}</p>
          {/* 后续需要渲染image、likes、tags等其他帖子字段,直接在该节点下补充即可 */}
        </div>
      ))}
    </div>
  )
}
关键避坑点
  • 不推荐在渲染阶段做多层data取值(比如写data.data.map()),这类写法可读性差,非常容易因为层级写错触发报错,建议在请求函数中就把需要的数组字段提前返回。
  • 所有依赖异步请求结果的渲染逻辑,必须放在加载、错误态判断之后,保证执行渲染时数据类型符合预期,避免初始渲染阶段访问undefined的属性/方法。
  • 遍历数组渲染列表项时,必须给列表项根节点传入唯一的key属性,直接使用接口返回的帖子id即可满足要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 07:27:20