useQuery()
Denna sida har översatts av PageTurner AI (beta). Inte officiellt godkänd av projektet. Hittade du ett fel? Rapportera problem →
useQuery är den primära hooken för datahämtning. Den fungerar liknande som @tanstack/react-query's useQuery, men med några trpc-specifika alternativ och extra funktioner som strömning.
För djupgående information om alternativ och användningsmönster, se TanStack Query-dokumentationen om queries.
Signatur
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>;}}
Eftersom UseTRPCQueryOptions utökar @tanstack/react-query's UseQueryOptions kan du använda alla deras alternativ här som enabled, refetchOnWindowFocus, etc. Vi har också några trpc-specifika alternativ som låter dig välja in eller ut ur vissa beteenden på per-procedure-nivå:
-
trpc.ssr: Om du harssr: truei din global config, kan du sätta detta till false för att inaktivera ssr för denna specifika query. Observera att det inte fungerar tvärtom, dvs. du kan inte aktivera ssr på en procedure om din globala config är satt till false. -
trpc.abortOnUnmount: Åsidosätt den global config och välj att avbryta eller inte avbryta queries vid demontering (unmount). -
trpc.context: Lägg till extra metadata som kan användas i Länkar.
Om du behöver sätta några alternativ men inte vill skicka någon input, kan du skicka undefined istället.
Du kommer att märka att du får autofyllning på input baserat på vad du har satt i ditt input-schema på backend:en.
Exempel på användning
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 >);}
Strömmande svar med async generators
Från och med v11 stöder vi nu strömmande queries när du använder httpBatchStreamLink.
När du returnerar en async generator i en query, kommer du att:
-
Få iteratorns resultat i
data-egenskapen som en array som uppdateras när svaret kommer in -
statuskommer att varasuccessså snart den första databiten mottagits. -
fetchStatus-egenskapen kommer att varafetchingtills sista databiten mottagits.
Exempel
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 >);}
result-egenskaper under strömning:
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] |