openapi-react-query 的 useInfiniteQuery 实战指南:基于 OpenAPI 的无限分页查询
开发工具代码生成后端【免费下载链接】openapi-typescriptGenerate TypeScript types from OpenAPI 3 specs项目地址https://gitcode.com/gh_mirrors/op/openapi-typescript点击查看免费下载导读useInfiniteQuery是openapi-react-query在tanstack/react-query原版useInfiniteQuery之上提供的类型安全封装方法专为加载更多式的无限分页场景设计。本文将讲解如何在生成 OpenAPI 类型的基础上用$api.useInfiniteQuery(...)一键接入游标分页 API并深入其源码实现说明分页游标参数是如何自动注入请求的以及如何通过pageParamName、select等选项定制分页行为。读完本文你将能在项目里用不到 10 行代码实现一个带Load More按钮的完整分页列表。一、useInfiniteQuery 是什么openapi-react-query是一个围绕tanstack/react-query的轻量类型安全封装库配合openapi-fetch发起请求和openapi-typescript根据 OpenAPI 3 schema 生成类型使用让 React 查询代码中的 URL、参数、请求体和响应全部与 schema 严格对齐。useInfiniteQuery是该库提供的五个核心方法之一其余为queryOptions、useQuery、useSuspenseQuery、useMutation见 OpenapiQueryClient 接口定义。它具备以下特点结果与原版一致返回值完全等同tanstack/react-query的useInfiniteQuery结果对象因此data.pages、fetchNextPage、hasNextPage、isFetching等属性都能直接使用查询键固定结构queryKey为[method, path, params]完全类型化data和error均由 OpenAPI schema 自动推导无需手写任何接口类型可透传无限查询选项作为第四个参数传入原版useInfiniteQuery的选项并额外支持pageParamName自定义游标参数名。更完整的库背景、特性清单与安装方式见 openapi-react-query 介绍文档。二、前置准备安装与类型生成在使用useInfiniteQuery之前需要安装本库及两个配套依赖参见 setup 说明npm i openapi-react-query openapi-fetch npm i -D openapi-typescript typescript然后根据你的 OpenAPI 3 schema 生成 TypeScript 类型npx openapi-typescript ./path/to/api/v1.yaml -o ./src/lib/api/v1.d.ts官方文档强烈建议在tsconfig.json中开启noUncheckedIndexedAccess以获得更严格的索引访问类型检查。生成的paths类型将作为后续所有类型推导的根基。三、完整示例加载更多分页列表以下示例来自官方文档由两个文件组成src/api.ts负责创建客户端src/app.tsx使用useInfiniteQuery渲染分页列表。1. 创建 fetch 客户端与 $apisrc/api.tsimport createFetchClient from openapi-fetch; import createClient from openapi-react-query; import type { paths } from ./my-openapi-3-schema; // generated by openapi-typescript const fetchClient createFetchClientpaths({ baseUrl: https://myapi.dev/v1/, }); export const $api createClient(fetchClient);createClient的入参是一个openapi-fetch的FetchClient实例返回带有queryOptions、useQuery、useSuspenseQuery、useInfiniteQuery、useMutation五个方法的类型安全客户端。关于createFetchClient的更多细节可参考 openapi-fetch 文档。2. 在组件中使用 useInfiniteQuerysrc/app.tsximport { $api } from ./api; const PostList () { const { data, fetchNextPage, hasNextPage, isFetching } $api.useInfiniteQuery( get, /posts, { params: { query: { limit: 10, }, }, }, { getNextPageParam: (lastPage) lastPage.nextPage, initialPageParam: 0, } ); return ( div {data?.pages.map((page, i) ( div key{i} {page.items.map((post) ( div key{post.id}{post.title}/div ))} /div ))} {hasNextPage ( button onClick{() fetchNextPage()} disabled{isFetching} {isFetching ? Loading... : Load More} /button )} /div ); }; export const App () { return ( ErrorBoundary fallbackRender{({ error }) Error: ${error.message}} MyComponent / /ErrorBoundary ); };要点解读第三个参数请求选项里的params.query.limit是业务参数会原样发送第四个参数是原版useInfiniteQuery的选项getNextPageParam从最后一页响应中提取下一页游标lastPage.nextPageinitialPageParam指定首页游标0data?.pages按页累积渲染hasNextPage为false时隐藏按钮fetchNextPage拉取下一页isFetching控制按钮禁用与文案。四、分页参数注入原理pageParamName 与游标无限查询与普通查询最大的不同在于分页游标参数不需要你手动写入请求选项。库会自动把它注入到每次请求的 query 参数中。从源码实现看useInfiniteQuery 实现内部queryFn会做如下合并const mergedInit { ...init, signal, params: { ...(init?.params || {}), query: { ...(init?.params as { query?: DefaultParamsOption })?.query, [pageParamName]: pageParam, }, }, };也就是说每次发起请求时保留你传入init中的全部参数如limit: 10将当前页码pageParam写入params.query[pageParamName]pageParamName默认为cursor因此默认发送的游标参数名是?cursorxxx首页pageParam取原版选项initialPageParam的值后续页取getNextPageParam的返回值。如果你服务的分页参数名不是cursor可通过infiniteQueryOptions.pageParamName自定义例如服务端期望follow_cursor$api.useInfiniteQuery( get, /paginated-data, { params: { query: { limit: 3 } } }, { getNextPageParam: (lastPage) lastPage.nextPage, initialPageParam: 0, pageParamName: follow_cursor, // 自定义游标参数名 } );这一点在官方测试中得到了验证测试 should use custom cursor params 断言首屏请求携带follow_cursor0第二页请求携带follow_cursor1。五、API 签名与参数详解官方文档给出的完整调用形态如下const query $api.useInfiniteQuery( method, path, options, infiniteQueryOptions, queryClient );参数说明method必需要使用的 HTTP 方法如get。该值会作为查询键的一部分。参见tanstack/react-query官方文档的 Query Keys 一节。path必需请求的路径名如/posts。必须是你的 schema 中该 method 下真实存在的路径否则会得到类型错误。该值同样作为查询键的一部分。options发起请求所用的 fetch 选项路径/查询参数、请求体等。只有当 OpenAPI schema 要求参数时才是必需的对于无参端点useInfiniteQuery的init参数仍是必填位这与useQuery不同见下文注意事项。options.params会作为查询键的一部分因此不同参数会各自独立缓存。infiniteQueryOptionspageParamName用于分页的查询参数名默认cursor。其余为原版useInfiniteQuery的全部选项如getNextPageParam、initialPageParam、select、staleTime等直接透传给tanstack/react-query。类型上对应源码中的UseInfiniteQueryMethod定义类型声明它在UseInfiniteQueryOptions基础上额外扩展了可选的pageParamName?: string字段。queryClient可选原版queryClient选项用于指定使用哪个 QueryClient 实例。六、源码纵深useInfiniteQuery 的类型与实现结合源码可以更清楚地理解它的行为边界。类型层面UseInfiniteQueryMethod的返回值类型为UseInfiniteQueryResult InferSelectReturnTypeInfiniteDataResponse[data], Options[select], Response[error] 其中Response[data]与Response[error]由FetchResponsePaths[Path][Method], Init, Media推导而来InfiniteData包装后即为{ pages, pageParams }结构。InferSelectReturnType源码会根据select的返回类型动态收敛data的类型——也就是说如果你用select把InfiniteData变换成了别的形状data的类型也会随之精确推导。实现层面核心queryFn在调用openapi-fetch客户端前完成三件事源码方法名大写化后从客户端取出对应方法client[GET]合并signal支持请求取消与init注入pageParam到params.query[pageParamName]。请求若返回error则直接throw error而非返回错误对象这与库内useQuery/useMutation的错误处理策略一致方便配合 ErrorBoundary 或error状态使用data则原样返回以累积到pages中。七、测试验证与进阶用法仓库中的 useInfiniteQuery 测试套件 覆盖了四条关键行为可作为使用参考基本分页正确性首屏请求携带limit3cursor0调用fetchNextPage()后第二页请求携带cursor1data.pages累积两页、hasNextPage为trueselect 变换分页数据利用select反转pages与pageParams适合最新优先的时间线场景测试断言反转后pages与pageParams均按预期排序自定义游标参数名pageParamName: follow_cursor时请求参数变为follow_cursor0/1select 返回类型推导select将InfiniteData拍平为number[]后result.current.data的类型精确收敛为number[] | undefined并以expectTypeOf做了编译期断言。进阶提示首屏与次页响应结构通常首屏响应中应包含nextPage或nextCursor字段配合getNextPageParam: (lastPage) lastPage.nextPage当返回undefined/null时hasNextPage自动变为falseinitialPageParam 必填原版 TanStack Query v5 要求显式提供initialPageParam否则首页游标无从谈起缓存隔离由于queryKey含params不同limit、不同筛选条件的无限查询互不串扰。八、注意事项与边界init参数位置与useQuery不同useInfiniteQuery的init参数在类型签名中是必填位置init: InitWithUnknownsInit即便端点无参也要传占位值这是由方法签名源码决定的分页方式适配pageParamName注入的是query 参数URL 查询字符串如果你的接口采用 offset/limit 数值分页或 Header 分页需要自行在getNextPageParam中换算成游标或改用useQuery 手动请求错误处理请求错误会以异常形式抛出建议像示例那样用 ErrorBoundary 包裹或在组件内捕获依赖版本本库是对tanstack/react-query的薄封装其行为随原版版本演进保持一致请确保项目安装的是与原版接口兼容的版本。通过以上讲解你应该已经能够在实际项目中直接使用$api.useInfiniteQuery快速构建类型安全的无限分页列表并在需要时通过pageParamName与select灵活定制分页语义和数据形态。更多查询相关的封装如queryOptions、useQuery、useSuspenseQuery可继续阅读 openapi-react-query 文档目录 下的对应章节。赞分享开发工具代码生成后端【免费下载链接】openapi-typescriptGenerate TypeScript types from OpenAPI 3 specs项目地址https://gitcode.com/gh_mirrors/op/openapi-typescript点击查看免费下载相关推荐openapi-react-query useQuery 实战指南用完全类型化的 React Query 查询 OpenAPI 接口openapi react query useQuery 实战指南用完全类型化的 React Query 查询 OpenAPI 接口 本文围绕 openapi开发工具代码生成后端Solid Query 无限查询Infinite Queries实战指南用 useInfiniteQuery 实现游标/页码分页与无限滚动Solid Query 无限查询Infinite Queries实战指南用 useInfiniteQuery 实现游标/页码分页与无限滚动 Solid Q前端缓存状态管理TanStack Query Preact 无限查询useInfiniteQuery实战指南分页加载、无限滚动与 maxPages 内存控制TanStack Query Preact 无限查询useInfiniteQuery实战指南分页加载、无限滚动与 maxPages 内存控制 无限列表是前端缓存状态管理上一篇RDP Wrapper Library安全部署如何在企业环境中安全使用并发RDP会话下一篇【免费下载】 Serialib一款简洁高效的跨平台串口通讯库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

TypeScript 原始类型完全指南:typescript-book 中的 7 种内置基元与实战要点

TypeScript 原始类型完全指南:typescript-book 中的 7 种内置基元与实战要点

文档教程 【免费下载链接】typescript-book The Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source. 项目地址: https://gitcode.com/gh_mirrors/typ/typescript-book 点击查看 免费下载 导读 本文基于开源…

2026/9/27 12:06:00 阅读更多 →
Spring Boot + Vue.js全栈房屋出租管理系统实战:从数据模型到账单自动生成

Spring Boot + Vue.js全栈房屋出租管理系统实战:从数据模型到账单自动生成

简介:这份资源是面向计算机、软件工程等专业学生及Java Web开发学习者的毕业设计完整方案,围绕房屋出租业务的数字化管理需求,提供基于Spring Boot与Vue.js的前后端分离系统实现。系统涵盖房屋信息管理、租客登记、电子合同生成、租金计算与支…

2026/9/27 12:06:10 阅读更多 →
LeetCode 41:原地哈希巧解缺失的第一个正数

LeetCode 41:原地哈希巧解缺失的第一个正数

1. 题目解剖:普通数组里藏着的"送命题"1.1 先看看题目到底让你干什么如果你在刷题列表里看到"缺失的第一个正数"这道题,千万别被"普通数组"四个字骗了——它看着人畜无害,实际是许多大厂面试和 LeetCode 41 的…

2026/9/27 12:06:15 阅读更多 →

最新新闻

把伊娃搬到桌面上,稚晖君开源机器人

把伊娃搬到桌面上,稚晖君开源机器人

由稚晖君开源的 ElectronBot。它不只是桌面摆件,而是一台能动的电脑配件。ElectronBot 是一款桌面级小机器人,外观设计的灵感来源是《机器人总动员》WALL-E 里面的伊娃。它通过 USB 直连电脑,把圆形屏幕、USB 摄像头、六轴舵机、AI 识别全部塞…

2026/9/30 13:23:06 阅读更多 →
Windows Hello指纹驱动开发实战:UMDF2+WinUSB避坑指南

Windows Hello指纹驱动开发实战:UMDF2+WinUSB避坑指南

简介:本资源是微软官方发布的《Windows Hello生物识别驱动设计指南》PDF文档,面向Windows驱动开发工程师、安全认证系统开发者及嵌入式生物识别设备厂商技术人员,系统解决WBDI(Windows Biometric Driver Interface)驱动…

2026/9/30 13:23:06 阅读更多 →
DX12 PBR渲染实战:从光照模型到IBL的完整实现与调参指南

DX12 PBR渲染实战:从光照模型到IBL的完整实现与调参指南

1. 从光照模型到PBR:为什么DX12项目绕不开这一步 很多人在DX12里跑通第一个三角形、把纹理贴上去之后,下一步就卡住了——画面看起来“能跑”,但就是不对劲。金属像塑料,塑料像纸片,光照要么死白要么死黑。这不是DX12的…

2026/9/30 13:23:06 阅读更多 →
Node-Red 本地物联网中枢:可视化编程与 MQTT 数据流实战

Node-Red 本地物联网中枢:可视化编程与 MQTT 数据流实战

1. 为什么我最终选了 Node-Red 做本地物联网中枢搞物联网项目的人大概都有过这种纠结:传感器数据上来了,想做个联动逻辑,写代码吧,改一行就得重新烧录或者重启服务;用现成的平台吧,又担心数据不在自己手里&…

2026/9/30 13:23:06 阅读更多 →
深信服HCI题库:超融合工程师的隐性知识验证指南

深信服HCI题库:超融合工程师的隐性知识验证指南

简介:本资源是面向深信服HCI(超融合基础设施)认证备考人员与IT运维工程师的专项题库资料,聚焦超融合架构原理、aSAN分布式存储、虚拟网络(VXLAN/业务网/管理网)、虚拟机优化、安全微隔离及FC/NFS存储对接等…

2026/9/30 13:23:06 阅读更多 →
AWS上构建AI视觉质检流水线:从模型训练到边缘部署的实战指南

AWS上构建AI视觉质检流水线:从模型训练到边缘部署的实战指南

工厂车间的灯光总是带着点昏黄,检测工位的老师傅用肉眼盯着一件件冲压件,一天下来眼睛酸得快睁不开。我跑了几年视觉项目,最深的一个体会是:真正能让工厂愿意掏钱的AI视觉质检,不是实验室里刷个99.8%的准确率就完事&am…

2026/9/30 13:22:05 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述:为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多,后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表,动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介:本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档,聚焦城市公共广告资源信息化管理痛点,提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构,含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求,背景很直接:公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关,开放给几个业务团队用。结果第一个月账单出来,额度直接超了 4 倍。仔细查日志,发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/29 19:29:29 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/29 3:55:56 阅读更多 →