createTRPCQueryUtils
useUtils
と同様に、createTRPCQueryUtils
は、@trpc/react-query
経由で実行するクエリのキャッシュデータを管理するためのヘルパーにアクセスできる関数です。これらのヘルパーは、実際には@tanstack/react-query
のqueryClient
メソッドの薄いラッパーです。ここで提供するよりも詳細なuseUtils
ヘルパーのオプションと使用方法のパターンについては、それぞれの@tanstack/react-query
ドキュメントにリンクしているので、適宜参照してください。
useUtils
とcreateTRPCQueryUtils
の違いは、useUtils
は内部でuseQueryClient
を使用するReactフックであるということです。これは、Reactコンポーネント内でより適切に動作できることを意味します。 createTRPCQueryUtils
の使用例は、Reactコンポーネントの外部でヘルパーを使用する必要がある場合、たとえばreact-routerのローダーなどです。
ReactコンポーネントではcreateTRPCQueryUtils
の使用は避けるべきです。代わりに、内部でuseCallback
とuseQueryClient
を実装するReactフックであるuseUtils
を使用してください。
使用方法
createTRPCQueryUtils
は、ルーターにあるすべての使用可能なクエリを含むオブジェクトを返します。 trpc
クライアントオブジェクトと同じ方法で使用します。クエリに到達すると、クエリヘルパーにアクセスできます。たとえば、all
クエリを持つpost
ルーターがあるとします。
コンポーネントで、createTRPCQueryUtils
が提供するオブジェクトをナビゲートしてpost.all
クエリに到達すると、クエリヘルパーにアクセスできます。
MyPage.tsxtsx
import { QueryClient } from '@tanstack/react-query';import { createTRPCQueryUtils, createTRPCReact } from '@trpc/react-query';import { useLoaderData } from 'react-router-dom';import type { AppRouter } from './server';const trpc = createTRPCReact<AppRouter>();const queryClient = new QueryClient();const clientUtils = createTRPCQueryUtils({ queryClient, client: trpc });// This is a react-router loaderexport async function loader() {const allPostsData = await clientUtils.post.all.ensureData(); // Fetches data if it doesn't exist in the cachereturn {allPostsData,};}// This is a react componentexport function Component() {const loaderData = useLoaderData() as Awaited<ReturnType<typeof loader>>;const allPostQuery = trpc.post.all.useQuery({initialData: loaderData.allPostsData, // Uses the data from the loader});return (<div>{allPostQuery.data.posts.map((post) => (<div key={post.id}>{post.title}</div>))}</div>);}
MyPage.tsxtsx
import { QueryClient } from '@tanstack/react-query';import { createTRPCQueryUtils, createTRPCReact } from '@trpc/react-query';import { useLoaderData } from 'react-router-dom';import type { AppRouter } from './server';const trpc = createTRPCReact<AppRouter>();const queryClient = new QueryClient();const clientUtils = createTRPCQueryUtils({ queryClient, client: trpc });// This is a react-router loaderexport async function loader() {const allPostsData = await clientUtils.post.all.ensureData(); // Fetches data if it doesn't exist in the cachereturn {allPostsData,};}// This is a react componentexport function Component() {const loaderData = useLoaderData() as Awaited<ReturnType<typeof loader>>;const allPostQuery = trpc.post.all.useQuery({initialData: loaderData.allPostsData, // Uses the data from the loader});return (<div>{allPostQuery.data.posts.map((post) => (<div key={post.id}>{post.title}</div>))}</div>);}
Remix RunまたはSSRを使用している場合は、リクエストごとに同じqueryClient
を再利用しません。代わりに、リクエストごとに新しいqueryClient
を作成して、リクエスト間のデータリークが発生しないようにします。
ヘルパー
useUtils
と同様に、createTRPCQueryUtils
は同じヘルパーセットへのアクセスを提供します。唯一の違いは、queryClient
オブジェクトとclient
オブジェクトを渡す必要があることです。
useUtilsページで確認できます。