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

React Query中数组无法遍历,访问元素返回undefined求助

问题:React Query获取的数组可打印但无法访问元素/遍历

问题根源

你的getUsers函数没有正确处理异步请求:axios的get是异步操作,函数直接返回了空数组users,React Query拿到的是这个初始空数组。后续axios请求完成后虽然修改了users数组,但此时组件已完成渲染,且数组是引用类型导致console.log会延迟展示更新后的内容,但代码执行usersQuery.data[1]时数组仍为空,所以返回undefined。

解决方案

1. 修正getUsers函数,返回Promise

让函数正确返回axios请求的Promise,确保React Query能等待异步请求完成后获取到完整数据:

方式一:使用async/await

import axios from "axios";

async function getUsers() {
  try {
    const response = await axios.get("https://random-data-api.com/api/v2/users?size=5&response_type=json");
    return response.data;
  } catch (err) {
    console.error(err);
    throw err; // 必须抛出错误,React Query才能触发isError状态
  }
}

export default getUsers;

方式二:直接返回Promise链

import axios from "axios";

function getUsers() {
  return axios
    .get("https://random-data-api.com/api/v2/users?size=5&response_type=json")
    .then(res => res.data)
    .catch(err => {
      console.error(err);
      throw err;
    });
}

export default getUsers;

2. 优化App组件的状态判断

用isSuccess替代isFetched,isSuccess会在请求成功且数据就绪后才为true,避免提前访问未就绪的数据:

import React from "react";
import getUsers from "./GetUsers";
import { useQuery } from "@tanstack/react-query";

function App() {
  const usersQuery = useQuery({
    queryKey: ["initUsers"],
    queryFn: getUsers, // 无需额外包裹函数
  });

  if (usersQuery.isLoading) return <p>Loading...</p>;
  if (usersQuery.isError) return <p>something went wrong</p>;
  if (usersQuery.isSuccess) {
    console.log(usersQuery.data);
    console.log(usersQuery.data[1]);
    return (
      <ul>
        {usersQuery.data.map(user => (
          <li key={user.id}>{user.first_name}</li>
        ))}
      </ul>
    );
  }

  return null; // 兜底返回
}

export default App;

关键说明

  • React Query的queryFn必须返回Promise,这样它才能正确处理异步状态(loading/success/error)。
  • 原代码中修改空数组的操作不会触发React Query的重新渲染,因为React Query追踪的是初始返回的数组引用,而非数组内部的变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 08:25:24