useQueryとuseMutationフック
useQueryでデータを取得し、useMutationでMutationを実行して、読み込み、エラー、データの状態を処理します
「useQueryとuseMutationフック」はCoddyKit上の無料React Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。
gqlを使ったクエリの定義
@apollo/clientのgqlテンプレートタグは、GraphQLクエリ文字列をモジュールの読み込み時にDocumentNodeへ解析します。クエリはコンポーネントの外側で定義します: const GET_USERS = gql`query GetUsers { users { id name email } }`。
注: 本番コードでは、gqlでラップした単一引用符の文字列を、タグ付きテンプレートとして使用してください。gqlタグはJavaScriptソース内のテンプレートリテラル構文を受け取ります。
useQueryの戻り値
useQuery(GET_USERS)は、{ loading, error, data, refetch, fetchMore, networkStatus }を返します。初回の取得中はloadingがtrueです。errorにはGraphQLエラーまたはネットワークエラーが含まれます。dataにはクエリの形状に対応するクエリ結果が含まれます。
null値のレンダリングを避けるため、dataにアクセスする前にloadingとerrorを確認してください。
ローディングとエラーのUIパターン
loadingがtrueの間はスケルトンコンポーネントをレンダリングします。errorが定義されている場合はエラーメッセージをレンダリングします(エラーのテキストにはerror.messageを使用します)。dataが定義され、loadingがfalseの場合にのみ、実際のコンテンツをレンダリングします。
この3状態パターン(loading / error / data)は、Apollo Clientコンポーネントの標準的な構成です。
クエリデータへのアクセス
dataオブジェクトはGraphQLクエリの構造を反映します。query { users { id name } }の場合、data.usersにアクセスすると、{id, name}オブジェクトの配列を取得できます。graphql-codegenを使って型付きフックを生成すれば、TypeScriptの型も一致します。
codegenを使わない場合、dataはanyとして型付けされます。codegenを使うと、useQueryが完全に型付けされたデータを自動的に返します。
useQueryの変数
2番目の引数として変数を渡します: useQuery(GET_USER, { variables: { id: userId } })。useEffectの依存配列と同様に、userIdが変わるとクエリが自動的に再実行されます。
Apollo Clientは、クエリと変数の一意の組み合わせごとに別々にキャッシュします。そのため、id: "1"のGET_USERとid: "2"のGET_USERには、独立したキャッシュエントリがあります。
クエリのスキップ
オプションにskip: trueを渡すと、クエリの実行を防止できます: useQuery(GET_USER, { skip: !userId })。skipがtrueの場合、Apolloはリクエストを送信せず、loadingはfalse、dataはundefinedになります。
これは、SWRのnullキーやReact Queryのenabled: falseオプションに相当するApolloの機能です。
手動での再フェッチ
useQueryが返すrefetch関数は、フェッチポリシーに関係なくネットワークリクエストを実行します。フォームの送信後など、ユーザー操作によってサーバーのデータが変更された可能性がある場合にrefetch()を呼び出します。
refetchに新しい変数を渡すこともできます: refetch({ id: newId })で異なるパラメーターを使って再フェッチします。
ネットワークステータスの追跡
オプションにnotifyOnNetworkStatusChange: trueを渡すと、ネットワークステータスの変化(取得、再フェッチ、ポーリングなど)に応じた更新を受け取れます。networkStatusフィールドには、NetworkStatus enumの数値コードが含まれます。
これにより、バックグラウンドで再フェッチが進行中でも現在のデータを隠さず、「更新中」を示す控えめなインジケーターを表示できます。
useMutationのシグネチャ
useMutation(CREATE_USER)は、[mutateFunction, { loading, error, data, reset }]を返します。ユーザーがフォームを送信したときにmutate関数を呼び出します。この関数は{ data, errors }を含むPromiseを返します。
mutate({ variables: { name: 'Alice', email: 'alice@example.com' } })を呼び出して、Mutationに入力を渡します。
onCompletedとonErrorのコールバック
useMutationのオプションにonCompleted: (data) => navigate('/dashboard')とonError: (error) => showToast(error.message)を渡します。これらのコールバックは、Mutationが解決または拒否された後に実行されます。
onCompletedはMutation結果のdataを受け取るため、画面遷移、成功メッセージの表示、フォームのリセットなどに利用できます。
useMutationの楽観的レスポンス
mutate呼び出しのoptimisticResponseオプションは、サーバーが応答する前に合成した結果をキャッシュへ即座に書き込みます。Apolloは楽観的なデータをすぐにレンダリングし、サーバーの実際のレスポンスが到着すると置き換えます。
Mutationが失敗した場合、Apolloは楽観的更新前のキャッシュ状態へ自動的にロールバックし、UIの整合性を保ちます。
useQueryのskipオプション
skip: trueを渡すと、useQueryはどうなりますか?
レッスンのまとめ
gqlタグでクエリを定義し、useQuery(QUERY, { variables, skip })を呼び出して、loading/error/dataの状態を処理します。useMutationはトリガー関数とステータスオブジェクトを返します。変数を渡して呼び出し、onCompletedとonErrorで結果を処理します。楽観的レスポンスはキャッシュを即座に更新し、失敗時には自動的にロールバックします。
skipオプションと変数に基づく再フェッチによって、条件付きおよびパラメーター付きのデータ読み込みに対応できます。
よくある質問
「useQueryとuseMutationフック」レッスンは無料ですか?
はい。「useQueryとuseMutationフック」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。
「useQueryとuseMutationフック」で何を学びますか?
useQueryでデータを取得し、useMutationでMutationを実行して、読み込み、エラー、データの状態を処理します ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
React Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「useQueryとuseMutationフック」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このReact Academyレッスンでコードを書いて実行できますか?
はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- React開発者のためのGraphQL基礎
- ReactでのApollo Clientセットアップ
- useQueryとuseMutationフック
- Apolloキャッシュ:正規化と更新