useInfiniteQuery()
非官方测试版翻译
本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
信息
- 你的过程需要接受任意类型的
cursor输入(string、number等)才能使用此钩子 - 有关无限查询的更多细节,请阅读 react-query 文档
- 本示例使用 Prisma - 参考其 基于游标的分页文档
示例过程
server/routers/_app.tstsximport {initTRPC } from '@trpc/server';import {z } from 'zod';export constt =initTRPC .create ();export constappRouter =t .router ({infinitePosts :t .procedure .input (z .object ({limit :z .number ().min (1).max (100).nullish (),cursor :z .number ().nullish (), // <-- "cursor" needs to exist, but can be any typedirection :z .enum (['forward', 'backward']), // optional, useful for bi-directional query}),).query (async (opts ) => {const {input } =opts ;constlimit =input .limit ?? 50;const {cursor } =input ;constitems = awaitprisma .post .findMany ({take :limit + 1, // get an extra item at the end which we'll use as next cursorwhere : {title : {contains : 'Prisma' /* Optional filter */,},},cursor :cursor ? {myCursor :cursor } :undefined ,orderBy : {myCursor : 'asc',},});letnextCursor : typeofcursor | undefined =undefined ;if (items .length >limit ) {constnextItem =items .pop ();nextCursor =nextItem !.myCursor ;}return {items ,nextCursor ,};}),});
server/routers/_app.tstsximport {initTRPC } from '@trpc/server';import {z } from 'zod';export constt =initTRPC .create ();export constappRouter =t .router ({infinitePosts :t .procedure .input (z .object ({limit :z .number ().min (1).max (100).nullish (),cursor :z .number ().nullish (), // <-- "cursor" needs to exist, but can be any typedirection :z .enum (['forward', 'backward']), // optional, useful for bi-directional query}),).query (async (opts ) => {const {input } =opts ;constlimit =input .limit ?? 50;const {cursor } =input ;constitems = awaitprisma .post .findMany ({take :limit + 1, // get an extra item at the end which we'll use as next cursorwhere : {title : {contains : 'Prisma' /* Optional filter */,},},cursor :cursor ? {myCursor :cursor } :undefined ,orderBy : {myCursor : 'asc',},});letnextCursor : typeofcursor | undefined =undefined ;if (items .length >limit ) {constnextItem =items .pop ();nextCursor =nextItem !.myCursor ;}return {items ,nextCursor ,};}),});
示例 React 组件
components/MyComponent.tsxtsximport {trpc } from '../utils/trpc';export functionMyComponent () {constmyQuery =trpc .infinitePosts .useInfiniteQuery ({limit : 10,},{getNextPageParam : (lastPage ) =>lastPage .nextCursor ,// initialCursor: 1, // <-- optional you can pass an initialCursor},);// [...]}
components/MyComponent.tsxtsximport {trpc } from '../utils/trpc';export functionMyComponent () {constmyQuery =trpc .infinitePosts .useInfiniteQuery ({limit : 10,},{getNextPageParam : (lastPage ) =>lastPage .nextCursor ,// initialCursor: 1, // <-- optional you can pass an initialCursor},);// [...]}
辅助函数
getInfiniteData()
该辅助函数从现有无限查询中获取当前缓存的数据
components/MyComponent.tsxtsximport {trpc } from '../utils/trpc';export functionMyComponent () {constutils =trpc .useUtils ();constmyMutation =trpc .infinitePosts .add .useMutation ({asynconMutate (opts ) {awaitutils .infinitePosts .list .cancel ();constallPosts =utils .infinitePosts .list .getInfiniteData ({limit : 10 });// [...]},});}
components/MyComponent.tsxtsximport {trpc } from '../utils/trpc';export functionMyComponent () {constutils =trpc .useUtils ();constmyMutation =trpc .infinitePosts .add .useMutation ({asynconMutate (opts ) {awaitutils .infinitePosts .list .cancel ();constallPosts =utils .infinitePosts .list .getInfiniteData ({limit : 10 });// [...]},});}
setInfiniteData()
此辅助工具允许更新查询的缓存数据
components/MyComponent.tsxtsximport {trpc } from '../utils/trpc';export functionMyComponent () {constutils =trpc .useUtils ();constmyMutation =trpc .infinitePosts .delete .useMutation ({asynconMutate (opts ) {awaitutils .infinitePosts .list .cancel ();utils .infinitePosts .list .setInfiniteData ({limit : 10 }, (data ) => {if (!data ) {return {pages : [],pageParams : [],};}return {...data ,pages :data .pages .map ((page ) => ({...page ,items :page .items .filter ((item ) =>item .status === 'published'),})),};});},});// [...]}
components/MyComponent.tsxtsximport {trpc } from '../utils/trpc';export functionMyComponent () {constutils =trpc .useUtils ();constmyMutation =trpc .infinitePosts .delete .useMutation ({asynconMutate (opts ) {awaitutils .infinitePosts .list .cancel ();utils .infinitePosts .list .setInfiniteData ({limit : 10 }, (data ) => {if (!data ) {return {pages : [],pageParams : [],};}return {...data ,pages :data .pages .map ((page ) => ({...page ,items :page .items .filter ((item ) =>item .status === 'published'),})),};});},});// [...]}