TanStack React Query
このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →
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.
この統合は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[]// ...}
セットアップ
1. 依存関係をインストールする
以下の依存関係をインストールする必要があります
- 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. AppRouterをインポートする
このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →
クライアントアプリケーションに AppRouter 型をインポートします。この型はAPI全体の構造を保持します。
utils/trpc.tstsimport type {AppRouter } from '../server/router';
utils/trpc.tstsimport type {AppRouter } from '../server/router';
import type を使用すると、コンパイル時に参照が削除されるため、誤ってサーバーサイドコードをクライアントにインポートするのを防げます。詳細はTypeScriptドキュメントを参照してください。
3a. tRPCコンテキストプロバイダーの設定
Reactコンテキストに依存する場合(例:Next.jsなどのフルスタックフレームワークでサーバーサイドレンダリングを使用する場合)、各リクエストごとに新しいQueryClientを作成することが重要です。これによりユーザー間でキャッシュが共有されるのを防げます。createTRPCContextを使用して、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 >();
次にtRPCクライアントを作成し、以下のようにアプリケーションをTRPCProviderでラップします。またReact Queryの設定と接続も必要です(詳細は公式ドキュメントで解説されています)。
既にアプリケーションでReact Queryを使用している場合、既存のQueryClientとQueryClientProviderを再利用する必要があります。QueryClientの初期化について詳しくはReact Queryドキュメントを参照してください。
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. クエリ/ミューテーションキープレフィックスを有効化して設定する
すべてのクエリとミューテーションに特定のキーをプレフィックスとして付与したい場合は、設定と使用例についてクエリキープレフィックスを参照してください。
3c. Reactコンテキストを使わずに設定する
Viteなどを使用したクライアントサイドレンダリングのみのSPAを構築する場合、QueryClientとtRPCクライアントを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. データ取得
これでtRPCのReact Query統合を使用し、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>);}