useQuery()
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
useQuery es el hook principal para obtener datos. Funciona de manera similar al useQuery de @tanstack/react-query, pero con opciones específicas de trpc y características adicionales como streaming.
Para información detallada sobre opciones y patrones de uso, consulta la documentación de TanStack Query sobre queries.
Firma
tsxfunction useQuery(input: TInput | SkipToken,opts?: UseTRPCQueryOptions;)interface UseTRPCQueryOptionsextends UseQueryOptions {trpc: {ssr?: boolean;abortOnUnmount?: boolean;context?: Record<string, unknown>;}}
tsxfunction useQuery(input: TInput | SkipToken,opts?: UseTRPCQueryOptions;)interface UseTRPCQueryOptionsextends UseQueryOptions {trpc: {ssr?: boolean;abortOnUnmount?: boolean;context?: Record<string, unknown>;}}
Como UseTRPCQueryOptions extiende UseQueryOptions de @tanstack/react-query, puedes usar cualquiera de sus opciones como enabled, refetchOnWindowFocus, etc. También tenemos opciones específicas de trpc que te permiten activar o desactivar comportamientos a nivel de procedimiento:
-
trpc.ssr: Si tienesssr: trueen tu configuración global, puedes establecer esto en false para desactivar ssr en esta consulta específica. Nota: Esto no funciona al revés, es decir, no puedes activar ssr en un procedimiento si tu configuración global está en false. -
trpc.abortOnUnmount: Sobrescribe la configuración global para activar o desactivar la cancelación de consultas al desmontar componentes. -
trpc.context: Añade metadatos adicionales que podrían usarse en Links.
Si necesitas establecer opciones pero no quieres pasar ningún input, puedes pasar undefined.
Notarás que obtienes autocompletado para el input basado en lo que has configurado en tu esquema de input en el backend.
Ejemplo de uso
Backend code
server/routers/_app.tstsximport { initTRPC } from '@trpc/server';import { z } from 'zod';export const t = initTRPC.create();export const appRouter = t.router({// Create procedure at path 'hello'hello: t.procedure// using zod schema to validate and infer input values.input(z.object({text: z.string().nullish(),}).nullish(),).query((opts) => {return {greeting: `hello ${opts.input?.text ?? 'world'}`,};}),});
server/routers/_app.tstsximport { initTRPC } from '@trpc/server';import { z } from 'zod';export const t = initTRPC.create();export const appRouter = t.router({// Create procedure at path 'hello'hello: t.procedure// using zod schema to validate and infer input values.input(z.object({text: z.string().nullish(),}).nullish(),).query((opts) => {return {greeting: `hello ${opts.input?.text ?? 'world'}`,};}),});
components/MyComponent.tsxtsximport { trpc } from '../utils/trpc';export function MyComponent() {// input is optional, so we don't have to pass second argumentconst helloNoArgs = trpc.hello.useQuery();const helloWithArgs = trpc.hello.useQuery({ text: 'client' });return (<div><h1>Hello World Example</h1><ul><li>helloNoArgs ({helloNoArgs.status}):{' '}<pre>{JSON.stringify(helloNoArgs.data, null, 2)}</pre></li><li>helloWithArgs ({helloWithArgs.status}):{' '}<pre>{JSON.stringify(helloWithArgs.data, null, 2)}</pre></li></ul></div>);}
components/MyComponent.tsxtsximport { trpc } from '../utils/trpc';export function MyComponent() {// input is optional, so we don't have to pass second argumentconst helloNoArgs = trpc.hello.useQuery();const helloWithArgs = trpc.hello.useQuery({ text: 'client' });return (<div><h1>Hello World Example</h1><ul><li>helloNoArgs ({helloNoArgs.status}):{' '}<pre>{JSON.stringify(helloNoArgs.data, null, 2)}</pre></li><li>helloWithArgs ({helloWithArgs.status}):{' '}<pre>{JSON.stringify(helloWithArgs.data, null, 2)}</pre></li></ul></div>);}
Respuestas en streaming usando generadores asíncronos
Desde la v11 admitimos consultas con streaming cuando usamos httpBatchStreamLink.
Al devolver generadores asíncronos en una consulta:
-
Recibirás los resultados del iterador en la propiedad
datacomo un array que se actualiza durante la respuesta -
El
statusserásuccessal recibir el primer fragmento -
La propiedad
fetchStatuspermanecerá comofetchinghasta recibir el último fragmento
Ejemplo
server/routers/_app.tstsximport { publicProcedure, router } from './trpc';const appRouter = router({iterable: publicProcedure.query(async function* () {for (let i = 0; i < 3; i++) {await new Promise((resolve) => setTimeout(resolve, 500));yield i;}}),});export type AppRouter = typeof appRouter;
server/routers/_app.tstsximport { publicProcedure, router } from './trpc';const appRouter = router({iterable: publicProcedure.query(async function* () {for (let i = 0; i < 3; i++) {await new Promise((resolve) => setTimeout(resolve, 500));yield i;}}),});export type AppRouter = typeof appRouter;
components/MyComponent.tsxtsximport { trpc } from '~/utils';export function MyComponent() {const result = trpc.iterable.useQuery();return (<div>{result.data?.map((chunk, index) => (<Fragment key={index}>{chunk}</Fragment>))}</div>);}
components/MyComponent.tsxtsximport { trpc } from '~/utils';export function MyComponent() {const result = trpc.iterable.useQuery();return (<div>{result.data?.map((chunk, index) => (<Fragment key={index}>{chunk}</Fragment>))}</div>);}
Propiedades de result durante el streaming:
status | fetchStatus | data |
|---|---|---|
'pending' | 'fetching' | undefined |
'success' | 'fetching' | [] |
'success' | 'fetching' | [1] |
'success' | 'fetching' | [1, 2] |
'success' | 'fetching' | [1, 2, 3] |
'success' | 'idle' | [1, 2, 3] |