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

如何用React Query预取动态数量的查询?

React Query 预取动态数量查询的实现方案

当然可以实现动态数量查询的预取,核心是利用React Query提供的queryClient.prefetchQuery方法,配合遍历逻辑处理动态列表。以下是适配你现有代码的具体实现:

1. 编写预取函数

创建一个独立的预取函数,接收你的persons数组,遍历每个元素发起预取请求:

import { queryClient } from './你的QueryClient实例路径'; // 替换为你的全局queryClient路径
import { INCOME_API } from './你的API路径';
import type { TransformerIncomeRequestDto } from './你的类型定义路径';

export const prefetchIncomeData = async (persons: { id: string; ident: string; incomeData: TransformerIncomeRequestDto }[]) => {
  // 并行发起所有预取请求,确保所有数据都被缓存
  await Promise.all(
    persons.map(async (person) => {
      await queryClient.prefetchQuery({
        queryKey: ["income", person.ident], // 和useQueries中的queryKey保持完全一致
        queryFn: async () => {
          const { data } = await INCOME_API.transformer.transformerIncome(person.incomeData);
          return data;
        },
        staleTime: Infinity, // 与useQueries的缓存配置对齐
      });
    })
  );
};

2. 在合适时机调用预取函数

你可以在组件挂载、路由跳转前等场景调用这个预取函数,确保后续调用useGetIncome时直接命中缓存:

组件内挂载时预取

import { useEffect } from 'react';
import { useGetIncome } from './你的useGetIncome路径';
import { prefetchIncomeData } from './你的预取函数路径';

const IncomeComponent = ({ persons }) => {
  useEffect(() => {
    // 当persons数组变化时,重新预取数据
    prefetchIncomeData(persons);
  }, [persons]);

  // 此时useGetIncome会直接读取缓存,不会重复发起请求
  const incomeQueries = useGetIncome(persons);

  // 渲染逻辑...
  return (
    <div>
      {incomeQueries.map((query, index) => (
        <div key={persons[index].id}>
          {query.isLoading ? '加载中...' : JSON.stringify(query.data)}
        </div>
      ))}
    </div>
  );
};

关键注意事项

  • 预取时的queryKey、queryFn、staleTime等配置必须和useQueries中的完全一致,否则无法命中缓存
  • 全局queryClient实例必须通过QueryClientProvider注入到应用中,确保预取的缓存能被组件读取
  • 如果不需要等待所有预取完成,可以去掉Promise.all,让请求并行发起,提升性能
  • 由于你在useQueries中开启了suspense: true,预取完成后组件渲染时会直接使用缓存数据,不会触发Suspense加载状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 23:15:04