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, consulta la documentación de react-query
- En este ejemplo estamos usando Prisma - revisa su documentación sobre paginación basada en cursor
Procedimiento de ejemplo
server/routers/_app.tstsximport { initTRPC } from '@trpc/server';import { z } from 'zod';import { Context } from './[trpc]';export const t = initTRPC.create();export const appRouter = 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 type}),).query(async (opts) => {const { input } = opts;const limit = input.limit ?? 50;const { cursor } = input;const items = await prisma.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',},});let nextCursor: typeof cursor | undefined = undefined;if (items.length > limit) {const nextItem = items.pop();nextCursor = nextItem!.myCursor;}return {items,nextCursor,};}),});
server/routers/_app.tstsximport { initTRPC } from '@trpc/server';import { z } from 'zod';import { Context } from './[trpc]';export const t = initTRPC.create();export const appRouter = 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 type}),).query(async (opts) => {const { input } = opts;const limit = input.limit ?? 50;const { cursor } = input;const items = await prisma.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',},});let nextCursor: typeof cursor | undefined = undefined;if (items.length > limit) {const nextItem = items.pop();nextCursor = nextItem!.myCursor;}return {items,nextCursor,};}),});
Componente React de ejemplo
components/MyComponent.tsxtsximport { trpc } from '../utils/trpc';export function MyComponent() {const myQuery = 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 function MyComponent() {const myQuery = 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 function MyComponent() {const utils = trpc.useUtils();const myMutation = trpc.infinitePosts.add.useMutation({async onMutate(opts) {await utils.infinitePosts.cancel();const allPosts = utils.infinitePosts.getInfiniteData({ limit: 10 });// [...]},});}
components/MyComponent.tsxtsximport { trpc } from '../utils/trpc';export function MyComponent() {const utils = trpc.useUtils();const myMutation = trpc.infinitePosts.add.useMutation({async onMutate(opts) {await utils.infinitePosts.cancel();const allPosts = utils.infinitePosts.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 function MyComponent() {const utils = trpc.useUtils();const myMutation = trpc.infinitePosts.delete.useMutation({async onMutate(opts) {await utils.infinitePosts.cancel();utils.infinitePosts.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 function MyComponent() {const utils = trpc.useUtils();const myMutation = trpc.infinitePosts.delete.useMutation({async onMutate(opts) {await utils.infinitePosts.cancel();utils.infinitePosts.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'),})),};});},});// [...]}