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
tsxdeclare functionuseQuery (input :TInput |SkipToken ,opts ?:UseTRPCQueryOptions ,): void;interfaceUseTRPCQueryOptions extendsUseQueryOptions {trpc : {ssr ?: boolean;abortOnUnmount ?: boolean;context ?:Record <string, unknown>;}}
tsxdeclare functionuseQuery (input :TInput |SkipToken ,opts ?:UseTRPCQueryOptions ,): void;interfaceUseTRPCQueryOptions extendsUseQueryOptions {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 para esta consulta específica. Nota que 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: Anula la configuración global y activa o desactiva la cancelación de consultas al desmontar. -
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 constt =initTRPC .create ();export constappRouter =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'}`,};}),});export typeAppRouter = typeofappRouter ;
server/routers/_app.tstsximport {initTRPC } from '@trpc/server';import {z } from 'zod';export constt =initTRPC .create ();export constappRouter =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'}`,};}),});export typeAppRouter = typeofappRouter ;
components/MyComponent.tsxtsximport {trpc } from '../utils/trpc';export functionMyComponent () {// input is optional, so we don't have to pass second argumentconsthelloNoArgs =trpc .hello .useQuery ();consthelloWithArgs =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 functionMyComponent () {// input is optional, so we don't have to pass second argumentconsthelloNoArgs =trpc .hello .useQuery ();consthelloWithArgs =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.
Cuando devuelves un generador asíncrono en una consulta, ocurrirá lo siguiente:
-
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 {initTRPC } from '@trpc/server';constt =initTRPC .create ();constappRouter =t .router ({iterable :t .procedure .query (async function* () {for (leti = 0;i < 3;i ++) {await newPromise ((resolve ) =>setTimeout (resolve , 500));yieldi ;}}),});export typeAppRouter = typeofappRouter ;
server/routers/_app.tstsximport {initTRPC } from '@trpc/server';constt =initTRPC .create ();constappRouter =t .router ({iterable :t .procedure .query (async function* () {for (leti = 0;i < 3;i ++) {await newPromise ((resolve ) =>setTimeout (resolve , 500));yieldi ;}}),});export typeAppRouter = typeofappRouter ;
components/MyComponent.tsxtsximportReact , {Fragment } from 'react';import {trpc } from '../utils/trpc';export functionMyComponent () {constresult =trpc .iterable .useQuery ();return (<div >{result .data ?.map ((chunk ,index ) => (<Fragment key ={index }>{chunk }</Fragment >))}</div >);}
components/MyComponent.tsxtsximportReact , {Fragment } from 'react';import {trpc } from '../utils/trpc';export functionMyComponent () {constresult =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' | [0] |
'success' | 'fetching' | [0, 1] |
'success' | 'fetching' | [0, 1, 2] |
'success' | 'idle' | [0, 1, 2] |