Queries、Mutations、Subscriptions
完全なオートコンプリートとエラー型を利用し、ReactコンポーネントからtRPCの型付きQueryとMutationを使います
「Queries、Mutations、Subscriptions」はCoddyKit上の無料React Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。
クエリプロシージャの定義
publicProcedure に .input(zodSchema).query(async ({ input, ctx }) => ...) を連結します。ハンドラーは検証済みの入力とリクエストコンテキストを受け取ります。オブジェクト、配列、プリミティブなど、シリアライズ可能な任意の値を返せます。
戻り値の型は自動的に推論され、クライアント上の対応する useQuery hook のデータ型になります。
React からのクエリ呼び出し
trpc.post.getById.useQuery({ id: '1' }) は、post ルーター内の getById プロシージャを呼び出します。この hook は、React Query でおなじみの結果オブジェクト { data, isLoading, isError, refetch } を返します。
入力オブジェクトには静的な型が付いています。スキーマが文字列を期待している場合に { id: 123 } を渡すと、開発時に TypeScript エラーとして検出されます。
ミューテーションプロシージャの定義
サーバー側でデータを書き込む操作(データの作成、更新、削除)には、.input(zodSchema).mutation(async ({ input, ctx }) => ...) を使用します。ミューテーションは明示的に呼び出すものであり、マウント時に自動実行されることはありません。
ミューテーションハンドラーは、ctx を介して完全なリクエストコンテキスト(NextAuth のセッションを含む)にアクセスできます。
React からのミューテーション呼び出し
const { mutate, isLoading, error } = trpc.post.create.useMutation() を実行します。ミューテーションを実行するには mutate({ title: 'New', content: '...' }) を呼び出します。React Query の useMutation と同様に、マウント時には実行されません。
ミューテーション後の副作用を処理するには、useMutation のオプションに onSuccess と onError のコールバックを渡します。
ミューテーション後のキャッシュ無効化
ミューテーションの成功後にクエリデータを更新するには、tRPC のユーティリティ hook を使用します: const utils = trpc.useUtils()。onSuccess 内で utils.post.getAll.invalidate() を呼び出すと、投稿一覧の再フェッチが実行されます。
これは React Query の queryClient.invalidateQueries() に相当する tRPC の方法で、同じ stale-and-refetch パターンに従います。
Zod による入力検証
tRPC はデフォルトで入力検証に Zod を使用します。Zod スキーマは実行時にサーバー上で実行され、形式が正しくない入力をハンドラーに到達する前に拒否します。同じスキーマからクライアント用の TypeScript 型も提供されます。
この二重の役割(実行時検証と TypeScript 型)によって重複がなくなります。Zod で契約を一度定義するだけで、両方の安全性が得られます。
httpBatchLink によるリクエストのバッチ処理
tRPC はデフォルトで httpBatchLink を使用し、同時に発生した複数の tRPC リクエストを 1 つの HTTP リクエストにまとめます。同じコンポーネントのレンダーサイクルで複数の useQuery 呼び出しを行うと、それらはまとめて送信され、まとめて解決されます。
これにより、ページ内で複数のデータが必要な場合でも、クエリごとに個別の HTTP リクエストを送る場合と比べて、ネットワークのオーバーヘッドを大幅に削減できます。
tRPC サブスクリプションの概要
サブスクリプションプロシージャを定義します: publicProcedure.subscription(async function*() { while (true) { yield await nextEvent(); } })。サブスクリプションは非同期ジェネレーターを使用し、WebSocket トランスポートが必要です。
サブスクリプションは、ライブ通知、共同編集のカーソル、AI レスポンスのストリーミングなど、リアルタイム機能に適しています。
WebSocket トランスポートのセットアップ
httpBatchLink を、splitLink を使った httpBatchLink と wsLink の組み合わせに置き換えます。サブスクリプションは wsLink に、クエリとミューテーションは httpBatchLink に振り分けます。createWSClient({ url: 'ws://localhost:3000' }) で WebSocket クライアントを作成します。
このハイブリッドトランスポートにより、ほとんどのリクエストでは効率的な HTTP のバッチ処理を使用し、サブスクリプションでは永続的な WebSocket 接続を使用できます。
React からのサブスクリプション呼び出し
trpc.notifications.onNew.useSubscription(undefined, { onData: (notification) => addToList(notification), onError: console.error }) でプロシージャを購読します。onData コールバックは、値が yield されるたびに呼び出されます。
WebSocket が切断されて再接続すると、サブスクリプションは自動的に再確立されます。
クエリ、ミューテーション、サブスクリプションの組み合わせ
リアルタイムの一覧ページでは、クエリで初期一覧を読み込み、ミューテーションで項目を追加し、サブスクリプションで他のユーザーによる追加をリアルタイムに受け取る構成が考えられます。3 つすべてが同じ AppRouter に対して型付けされ、自然に組み合わせられます。
キャッシュ無効化の戦略は、完全な再フェッチ(ミューテーション後に invalidate)とキャッシュ更新(utils.post.getAll.setData)のどちらを選ぶかによって異なります。
tRPC のミューテーションとキャッシュ無効化
ミューテーションの成功後にクエリの再フェッチを実行する tRPC のユーティリティメソッドはどれでしょうか。
レッスンのまとめ
.query() でクエリを、.mutation() でミューテーションを定義し、どちらも Zod スキーマで検証します。クライアントでは trpc.router.procedure.useQuery() と useMutation() を使用します。ミューテーション後は utils.procedure.invalidate() でクエリを無効化します。サブスクリプションは非同期ジェネレーターを使用し、WebSocket トランスポートには wsLink が必要です。
httpBatchLink はデフォルトで同時実行されたクエリを 1 つの HTTP リクエストにまとめます。
よくある質問
「Queries、Mutations、Subscriptions」レッスンは無料ですか?
はい。「Queries、Mutations、Subscriptions」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。
「Queries、Mutations、Subscriptions」で何を学びますか?
完全なオートコンプリートとエラー型を利用し、ReactコンポーネントからtRPCの型付きQueryとMutationを使います ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
React Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「Queries、Mutations、Subscriptions」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このReact Academyレッスンでコードを書いて実行できますか?
はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- tRPCが解決する問題
- ReactとNext.jsでのtRPCセットアップ
- Queries、Mutations、Subscriptions
- tRPC と React Query、認証を統合する