TanStack React Query
Denna sida har översatts av PageTurner AI (beta). Inte officiellt godkänd av projektet. Hittade du ett fel? Rapportera problem →
Compared to our classic React Query Integration this client is simpler and more TanStack Query-native, providing factories for common TanStack React Query interfaces like QueryKeys, QueryOptions, and MutationOptions. We think it's the future and recommend using this over the classic client, read the announcement post for more information about this change.
Du kan testa denna integration på tRPC.io:s hemsida: https://trpc.io/?try=minimal-react#try-it-out
❓ Do I have to use an integration?
No! The integration is fully optional. You can use @tanstack/react-query using just a vanilla tRPC client, although then you'll have to manually manage query keys and do not get the same level of DX as when using the integration package.
utils/trpc.tstsimport {createTRPCClient ,httpBatchLink } from '@trpc/client';import type {AppRouter } from '../server/router';export consttrpc =createTRPCClient <AppRouter >({links : [httpBatchLink ({url : 'YOUR_API_URL' })],});
utils/trpc.tstsimport {createTRPCClient ,httpBatchLink } from '@trpc/client';import type {AppRouter } from '../server/router';export consttrpc =createTRPCClient <AppRouter >({links : [httpBatchLink ({url : 'YOUR_API_URL' })],});
components/PostList.tsxtsximport {useQuery } from '@tanstack/react-query';import {trpc } from './utils/trpc';functionPostList () {const {data } =useQuery ({queryKey : ['posts'] asconst ,queryFn : () =>trpc .post .list .query (),});data ; // Post[]// ...}
components/PostList.tsxtsximport {useQuery } from '@tanstack/react-query';import {trpc } from './utils/trpc';functionPostList () {const {data } =useQuery ({queryKey : ['posts'] asconst ,queryFn : () =>trpc .post .list .query (),});data ; // Post[]// ...}
Konfiguration
1. Installera beroenden
Följande beroenden måste installeras
- npm
- yarn
- pnpm
- bun
- deno
npm install @trpc/server @trpc/client @trpc/tanstack-react-query @tanstack/react-query
yarn add @trpc/server @trpc/client @trpc/tanstack-react-query @tanstack/react-query
pnpm add @trpc/server @trpc/client @trpc/tanstack-react-query @tanstack/react-query
bun add @trpc/server @trpc/client @trpc/tanstack-react-query @tanstack/react-query
deno add npm:@trpc/server npm:@trpc/client npm:@trpc/tanstack-react-query npm:@tanstack/react-query
Om du använder en AI-kodningsagent, installera tRPC-färdigheter för bättre kodgenerering:
bashnpx @tanstack/intent@latest install
bashnpx @tanstack/intent@latest install
2. Importera din AppRouter
Denna sida har översatts av PageTurner AI (beta). Inte officiellt godkänd av projektet. Hittade du ett fel? Rapportera problem →
Importera din AppRouter-typ till klientapplikationen. Den här typen beskriver strukturen för hela ditt API.
utils/trpc.tstsimport type { AppRouter } from '../server/router';
utils/trpc.tstsimport type { AppRouter } from '../server/router';
Genom att använda import type säkerställer du att referensen tas bort vid kompilering, vilket innebär att du inte av misstag importerar serverkod till din klient. För mer information, se dokumentationen för TypeScript.
3a. Konfigurera tRPC-kontextprovidern
När du förlitar dig på React-kontext, t.ex. vid server-side rendering i fullstack-ramverk som Next.js, är det viktigt att skapa en ny QueryClient för varje förfrågan så att användare inte delar samma cache. Du kan använda createTRPCContext för att skapa typsäkra kontextproviders och konsumenter från din AppRouter-typsignatur.
utils/trpc.tstsximport {createTR PCContext } from '@trpc/tanstack-react-query';importtype { AppRouter } from '../server/router'; export const { TRPCProvider, useTRPC, useTRPCClient } = createTRPCContext<AppRouter>();
utils/trpc.tstsximport {createTR PCContext } from '@trpc/tanstack-react-query';importtype { AppRouter } from '../server/router'; export const { TRPCProvider, useTRPC, useTRPCClient } = createTRPCContext<AppRouter>();
Skapa sedan en tRPC-klient och omslut din applikation med TRPCProvider enligt nedan. Du måste också konfigurera och ansluta React Query, vilket dokumenteras mer ingående.
Om du redan använder React Query i din applikation bör du återanvända den QueryClient och QueryClientProvider du redan har. Du kan läsa mer om QueryClient-initiering i React Query-dokumentationen.
components/App.tsxtsximport {QueryCli ent, QueryClientProvider } from '@tanstack/react-query';import{ createTRPCClient, httpBatchLink } from '@trpc/client'; import{ useState } from 'react'; import type { AppRouter } from '../server/router';import{ TRPCProvider } from '../utils/trpc'; functionmakeQueryClient() { return new QueryClient({defaultOptions: {queries: {// With SSR, we usually want to set some default staleTime// above 0 to avoid refetching immediately on the client staleTime: 60 * 1000,},},});}let browserQueryClient: QueryClient | undefined = undefined; function getQueryClient() { if (typeof window === 'undefined') {// Server: always make a new query clientreturn makeQueryClient();} else {// Browser: make a new query client if we don't already have one// This is very important, so we don't re-make a new client if React// suspends during the initial render. This may not be needed if we// have a suspense boundary BELOW the creation of the query clientif (!browserQueryClient) browserQueryClient = makeQueryClient();return browserQueryClient;}}export function App() {const queryClient = getQueryClient();const [trpcClient] = useState(() =>createTRPCClient<AppRouter>({links: [httpBatchLink({ url: 'http://localhost:2022',}),],}),);return (<QueryClientProvider client={queryClient}><TRPCProvider trpcClient={trpcClient} queryClient={queryClient}>{null /* Your app here */}</TRPCProvider></QueryClientProvider>);}
components/App.tsxtsximport {QueryCli ent, QueryClientProvider } from '@tanstack/react-query';import{ createTRPCClient, httpBatchLink } from '@trpc/client'; import{ useState } from 'react'; import type { AppRouter } from '../server/router';import{ TRPCProvider } from '../utils/trpc'; functionmakeQueryClient() { return new QueryClient({defaultOptions: { queries: {// With SSR, we usually want to set some default staleTime// above 0 to avoid refetching immediately on the client staleTime: 60 * 1000,},},});}let browserQueryClient: QueryClient | undefined = undefined; function getQueryClient() { if (typeof window === 'undefined') {// Server: always make a new query clientreturn makeQueryClient();} else {// Browser: make a new query client if we don't already have one// This is very important, so we don't re-make a new client if React// suspends during the initial render. This may not be needed if we// have a suspense boundary BELOW the creation of the query clientif (!browserQueryClient) browserQueryClient = makeQueryClient();return browserQueryClient;}}export function App() {const queryClient = getQueryClient();const [trpcClient] = useState(() =>createTRPCClient<AppRouter>({links: [httpBatchLink({ url: 'http://localhost:2022',}),],}),);return (<QueryClientProvider client={queryClient}><TRPCProvider trpcClient={trpcClient} queryClient={queryClient}>{null /* Your app here */}</TRPCProvider></QueryClientProvider>);}
3b. Konfigurera med nyckelprefix för queries och mutations
Om du vill lägga till ett specifikt prefix till alla dina queries och mutations, se Nyckelprefix för konfiguration och användningsexempel.
3c. Konfigurera utan React-kontext
När du bygger ett SPA med endast klientsidig rendering (t.ex. med Vite) kan du skapa QueryClient och tRPC-klienten utanför React-kontext som singletons.
utils/trpc.tstsimport {QueryCli ent } from '@tanstack/react-query';import{ createTRPCClient, httpBatchLink } from '@trpc/client'; import{ createTRPCOptionsProxy } from '@trpc/tanstack-react-query'; import type { AppRouter } from '../server/router';exportconst queryClient = new QueryClient (); const trpcClient = createTRPCClient<AppRouter>({links: [httpBatchLink({ url: 'http://localhost:2022' })], });export const trpc = createTRPCOptionsProxy<AppRouter>({client:trpcClient, queryClient,});
utils/trpc.tstsimport {QueryCli ent } from '@tanstack/react-query';import{ createTRPCClient, httpBatchLink } from '@trpc/client'; import{ createTRPCOptionsProxy } from '@trpc/tanstack-react-query'; import type { AppRouter } from '../server/router';exportconst queryClient = new QueryClient (); const trpcClient = createTRPCClient<AppRouter>({links: [httpBatchLink({ url: 'http://localhost:2022' })], });export const trpc = createTRPCOptionsProxy<AppRouter>({client: trpcClient, queryClient,});
components/App.tsxtsximport {QueryCli entProvider } from '@tanstack/react-query';import{ queryClient } from '../utils/trpc'; export function App() {return (<QueryClientProvider client= {queryClient}> {/* Your app here */} </QueryClientProvider>);}
components/App.tsxtsximport {QueryCli entProvider } from '@tanstack/react-query';import{ queryClient } from '../utils/trpc'; export function App() {return (<QueryClientProvider client= {queryClient}> {/* Your app here */} </QueryClientProvider>);}
4. Hämta data
Du kan nu använda tRPC:s React Query-integration för att anropa queries och mutations mot ditt API.
components/user-list.tsxtsximport {useMutat ion, useQuery } from '@tanstack/react-query';import{ useTRPC } from '../utils/trpc'; export default function UserList() {const trpc =useTRPC(); // use `import { trpc } from './utils/trpc'` if you're using the singleton pattern constuserQuery = useQuery( trpc. getUser .queryOptions({ id: 'id_bilbo' })); const userCreator = useMutation(trpc.createUser.mutationOptions());return (<div><p>{userQuery.data?.name}</p><button onClick={() => userCreator.mutate({ name: 'Frodo' })}>Create Frodo</button></div>);}
components/user-list.tsxtsximport {useMutat ion, useQuery } from '@tanstack/react-query';import{ useTRPC } from '../utils/trpc'; export default function UserList() {const trpc =useTRPC(); // use `import { trpc } from './utils/trpc'` if you're using the singleton pattern constuserQuery = useQuery (trpc.getUser. queryOptions({ id: 'id_bilbo' })); const userCreator = useMutation(trpc.createUser.mutationOptions());return (<div><p>{userQuery.data?.name}</p> <button onClick={() => userCreator.mutate({ name: 'Frodo' })}>Create Frodo</button></div>);}