0Pricing
React Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. React開発者のためのGraphQL基礎
  2. ReactでのApollo Clientセットアップ
  3. useQueryとuseMutationフック
  4. Apolloキャッシュ:正規化と更新
← React Academyに戻る