useSWRフック:取得、読み込み、エラー状態
カスタムfetcher関数とuseSWRを使い、読み込み、エラー、成功の状態を宣言的に処理します
「useSWRフック:取得、読み込み、エラー状態」はCoddyKit上の無料React Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。
useSWRのシグネチャ
useSWR(key, fetcher, options)が主要なフックです。keyはキャッシュキー(通常はURL文字列)、fetcherはデータを返す非同期関数、optionsは省略可能な設定オブジェクトです。
このフックは、data、error、isLoading、isValidating、mutate関数を含むオブジェクトを返します。
keyパラメーター
keyには、文字列のURL、[url, params]の配列、またはnullを指定できます。文字列キーは単純なGETリクエストに対応します。配列キーを使うと、userIdやfiltersなどの変数をキャッシュの識別情報に組み込めます。
nullを渡すとリクエスト全体が無効になります。必要なデータがまだ利用できない場合の条件付きフェッチに便利です。
fetcher関数
fetcherはキー(または引数として展開された配列キー)を受け取り、Promiseを返す必要があります。Promiseが解決した値がdataになります。fetcherが例外をスローすると、errorプロパティが設定されます。
例: (url) => fetch(url).then(r => { if (!r.ok) throw new Error(r.status); return r.json(); })。
dataとerrorの状態
dataは初回ローディング中はundefinedで、成功するとfetcherが解決した値になります。fetcherが例外をスローしない限り、errorはundefinedです。例外がスローされた場合は、そのスローされたエラーオブジェクトが格納されます。
if (error)でエラーメッセージを表示し、if (!data)でローディングスケルトンを表示すると、明確なフォールバックUIを提供できます。
isLoadingとisValidatingの違い
isLoadingがtrueになるのは、キャッシュデータがなく、リクエストが進行中の場合だけです。つまり、そのキーに対する初回の読み込み時です。isValidatingは、キャッシュデータがすでに存在する場合のバックグラウンド再検証を含め、リクエストが進行中であれば常にtrueになります。
スケルトン画面にはisLoadingを使い、バックグラウンド更新を示す控えめなスピナーにはisValidatingを使います。
グローバルSWRConfig
SWRConfigを使うと、そのサブツリー内のすべてのuseSWR呼び出しに対して、デフォルトのfetcher、dedupingInterval、refreshInterval、onErrorハンドラーなどのオプションを定義できます。これにより、すべてのフックでオプションを繰り返す代わりに、設定を一元管理できます。
複数のSWRConfigプロバイダーを入れ子にすると、アプリのセクションごとに異なるデフォルト値を設定できます。
nullキーによる条件付きフェッチ
リクエストをスキップするには、キーとしてnullを渡します。useSWR(isLoggedIn ? '/api/user' : null, fetcher)。キーがnull以外の値になるまで、SWRはフェッチを実行しません。
これはReact Queryのskipオプションよりもすっきりした方法です。キーがnullから文字列へ変わると、自動的に初回フェッチが開始されます。
依存関係のあるフェッチ
依存関係のあるリクエストには、SWRのフックを連鎖させます。const { data: user } = useSWR('/api/me', fetcher)の後に、const { data: orders } = useSWR(user ? '/api/orders/' + user.id : null, fetcher)を実行します。2つ目のフックは1つ目の結果が返るまで待機します。
このパターンにより、useEffectの連鎖を避けながら、データの依存関係を宣言的で読みやすく保てます。
リクエストの重複排除を実際に確認する
HeaderコンポーネントとSidebarコンポーネントがどちらもuseSWR('/api/user', fetcher)を呼び出した場合、SWRが送信するリクエストは1つだけで、結果は共有されます。データまたはエラーが更新されると、両方のコンポーネントが同時に再レンダリングされます。
この重複排除は、追加設定なしでdedupingIntervalの期間(デフォルトは2000ms)内に自動的に行われます。
便利なSWRオプション
refreshInterval: 5000は5秒ごとにポーリングします。refreshWhenHidden: falseは、タブが表示されていない間のポーリングを停止します。shouldRetryOnError: falseは自動再試行を無効にします。revalidateOnFocus: falseはフォーカスによる再検証を無効にします。
データの鮮度に関する要件に合わせてオプションを組み合わせます。ダッシュボードではrefreshIntervalをよく使い、静的コンテンツではrevalidateOnFocus: falseを設定します。
useSWRによるページネーション
ページ単位のデータでは、キーにページ番号を含めます。useSWR(['/api/items', page], fetcher)。ページを変更すると、そのページの新しいフェッチが開始され、以前のページはキャッシュされます。
SWRにはuseSWRInfiniteも用意されています。getKey関数でページインデックスと前のページのデータに基づくキーを構築し、カーソルベースや無限スクロールのパターンを実装できます。
SWRのキーとしてのnull
useSWRのキーにnullを渡すとどうなるでしょうか。
レッスンの振り返り
useSWR(key, fetcher)はdata、error、isLoading、isValidatingを返します。nullキーを使うと、条件付きリクエストや依存関係のあるリクエストでフェッチを無効にできます。isLoadingは初回の読み込みを示し、isValidatingは進行中のリクエストがあることを示します。SWRConfigでデフォルト値を一元管理でき、コンポーネント間のリクエストの重複排除も自動的に行われます。
refreshInterval、revalidateOnFocus、shouldRetryOnErrorなどのオプションを使うと、フック単位またはグローバルにデータの鮮度に関する動作を細かく調整できます。
よくある質問
「useSWRフック:取得、読み込み、エラー状態」レッスンは無料ですか?
はい。「useSWRフック:取得、読み込み、エラー状態」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。
「useSWRフック:取得、読み込み、エラー状態」で何を学びますか?
カスタムfetcher関数とuseSWRを使い、読み込み、エラー、成功の状態を宣言的に処理します ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
React Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「useSWRフック:取得、読み込み、エラー状態」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このReact Academyレッスンでコードを書いて実行できますか?
はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- SWRの基本概念:Stale-While-Revalidate
- useSWRフック:取得、読み込み、エラー状態
- SWRによるMutationと楽観的更新
- SWRとReact Query:適切なツールの選択