useInfiniteQuery()
Traducción Beta No Oficial
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
información
- Tu procedimiento debe aceptar una entrada
cursorde cualquier tipo (string,number, etc.) para exponer este hook. - Para más detalles sobre consultas infinitas, lee la documentación de react-query
- En este ejemplo usamos Prisma - consulta su documentación sobre paginación basada en cursor
Procedimiento de ejemplo
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 ,};}),});
Componente React de ejemplo
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},);// [...]}
Utilidades
getInfiniteData()
Esta función auxiliar obtiene los datos actualmente almacenados en caché de una consulta infinita existente
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()
Esta función auxiliar te permite actualizar los datos en caché de una consulta
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'),})),};});},});// [...]}