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.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[]// ...}
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
Si vous utilisez un agent de codage IA, installez les compétences tRPC pour une meilleure génération de code :
bashnpx @tanstack/intent@latest install
bashnpx @tanstack/intent@latest install
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 {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>();
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 {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. 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 {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. 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 {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>);}