TanStack React Query
Cette page a Ă©tĂ© traduite par PageTurner AI (bĂȘta). Non approuvĂ©e officiellement par le projet. Vous avez trouvĂ© une erreur ? Signaler un problĂšme â
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.
Vous pouvez tester cette intégration sur la page d'accueil de tRPC.io : 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.tstsexport const trpc = createTRPCClient<AppRouter>({links: [httpBatchLink({ url: 'YOUR_API_URL' })],});
utils/trpc.tstsexport const trpc = createTRPCClient<AppRouter>({links: [httpBatchLink({ url: 'YOUR_API_URL' })],});
components/PostList.tsxtsxfunction PostList() {const { data } = useQuery({queryKey: ['posts'],queryFn: () => trpc.post.list.query(),});data; // Post[]// ...}
components/PostList.tsxtsxfunction PostList() {const { data } = useQuery({queryKey: ['posts'],queryFn: () => trpc.post.list.query(),});data; // Post[]// ...}
Configurationâ
1. Installer les dĂ©pendancesâ
Les dĂ©pendances suivantes doivent ĂȘtre installĂ©es :
- 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
2. Importer votre AppRouterâ
Cette page a Ă©tĂ© traduite par PageTurner AI (bĂȘta). Non approuvĂ©e officiellement par le projet. Vous avez trouvĂ© une erreur ? Signaler un problĂšme â
Importez le type AppRouter dans l'application cliente. Ce type représente la structure complÚte de votre API.
utils/trpc.tstsimport type {AppRouter } from '../server/router';
utils/trpc.tstsimport type {AppRouter } from '../server/router';
En utilisant import type, vous garantissez que la référence sera supprimée lors de la compilation, évitant ainsi d'importer par inadvertance du code serveur dans votre client. Pour plus d'informations, consultez la documentation TypeScript.
3a. Configurer le fournisseur de contexte tRPCâ
Lorsque vous utilisez le contexte React, par exemple avec le rendu cĂŽtĂ© serveur dans des frameworks full-stack comme Next.js, il est crucial de crĂ©er un nouveau QueryClient pour chaque requĂȘte. Cela Ă©vite que vos utilisateurs partagent le mĂȘme cache. Utilisez createTRPCContext pour crĂ©er des fournisseurs et consommateurs de contexte typĂ©s Ă partir de la signature de type de votre AppRouter.
utils/trpc.tstsximport {createTRPCContext } from '@trpc/tanstack-react-query';import type {AppRouter } from '../server/router';Âexport const {TRPCProvider ,useTRPC ,useTRPCClient } =createTRPCContext <AppRouter >();
utils/trpc.tstsximport {createTRPCContext } from '@trpc/tanstack-react-query';import type {AppRouter } from '../server/router';Âexport const {TRPCProvider ,useTRPC ,useTRPCClient } =createTRPCContext <AppRouter >();
Créez ensuite un client tRPC et encapsulez votre application dans le TRPCProvider comme ci-dessous. Vous devrez également configurer et connecter React Query, dont la documentation approfondit ce sujet.
Si vous utilisez déjà React Query dans votre application, vous devriez réutiliser le QueryClient et QueryClientProvider existants. Consultez la documentation de React Query pour l'initialisation du QueryClient : React Query docs.
components/App.tsxtsximport { QueryClient, QueryClientProvider } from '@tanstack/react-query';import { createTRPCClient, httpBatchLink } from '@trpc/client';import { useState } from 'react';import { TRPCProvider } from './utils/trpc';function makeQueryClient() {return new QueryClient({defaultOptions: {queries: {// With SSR, we usually want to set some default staleTime// above 0 to avoid refetching immediately on the clientstaleTime: 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}>{/* Your app here */}</TRPCProvider></QueryClientProvider>);}
components/App.tsxtsximport { QueryClient, QueryClientProvider } from '@tanstack/react-query';import { createTRPCClient, httpBatchLink } from '@trpc/client';import { useState } from 'react';import { TRPCProvider } from './utils/trpc';function makeQueryClient() {return new QueryClient({defaultOptions: {queries: {// With SSR, we usually want to set some default staleTime// above 0 to avoid refetching immediately on the clientstaleTime: 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}>{/* Your app here */}</TRPCProvider></QueryClientProvider>);}
3b. Configurer avec le prĂ©fixage des clĂ©s de requĂȘtes/mutations activĂ©â
Si vous souhaitez prĂ©fixer toutes les requĂȘtes et mutations avec une clĂ© spĂ©cifique, consultez PrĂ©fixage des clĂ©s de requĂȘtes/mutations pour des exemples de configuration et d'utilisation.
3c. Configurer sans le contexte Reactâ
Lors du développement d'une SPA avec rendu exclusivement cÎté client (par exemple avec Vite), vous pouvez créer le QueryClient et le client tRPC en tant que singletons hors du contexte React.
utils/trpc.tstsimport { QueryClient } from '@tanstack/react-query';import { createTRPCClient, httpBatchLink } from '@trpc/client';import { createTRPCOptionsProxy } from '@trpc/tanstack-react-query';import type { AppRouter } from '../server/router';export const queryClient = new QueryClient();const trpcClient = createTRPCClient<AppRouter>({links: [httpBatchLink({ url: 'http://localhost:2022' })],});export const trpc = createTRPCOptionsProxy<AppRouter>({client: trpcClient,queryClient,});
utils/trpc.tstsimport { QueryClient } from '@tanstack/react-query';import { createTRPCClient, httpBatchLink } from '@trpc/client';import { createTRPCOptionsProxy } from '@trpc/tanstack-react-query';import type { AppRouter } from '../server/router';export const queryClient = new QueryClient();const trpcClient = createTRPCClient<AppRouter>({links: [httpBatchLink({ url: 'http://localhost:2022' })],});export const trpc = createTRPCOptionsProxy<AppRouter>({client: trpcClient,queryClient,});
components/App.tsxtsximport { QueryClientProvider } from '@tanstack/react-query';import React from 'react';import { queryClient } from './utils/trpc';export function App() {return (<QueryClientProvider client={queryClient}>{/* Your app here */}</QueryClientProvider>);}
components/App.tsxtsximport { QueryClientProvider } from '@tanstack/react-query';import React from 'react';import { queryClient } from './utils/trpc';export function App() {return (<QueryClientProvider client={queryClient}>{/* Your app here */}</QueryClientProvider>);}
4. RĂ©cupĂ©rer les donnĂ©esâ
Vous pouvez maintenant utiliser l'intégration tRPC avec React Query pour appeler des queries et mutations sur votre API.
components/user-list.tsxtsximport { useMutation, 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 patternconst userQuery = 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 { useMutation, 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 patternconst userQuery = 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>);}