仮想化とデータ取得の組み合わせ
仮想化されたリストが末尾に到達したときにデータ取得を開始し、無限スクロールを実装します。
「仮想化とデータ取得の組み合わせ」はCoddyKit上の無料React Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。
無限スクロールのパターン
無限スクロールでは、明示的なページボタンでページネーションする代わりに、ユーザーがリストの末尾に近づくと追加のデータを読み込みます。仮想化と組み合わせることで、非常に大きなデータセットもスムーズに閲覧できます。
リストには表示中の行だけを表示し、ユーザーが下端に到達する少し前に、バックグラウンドで新しいデータを取得します。
onItemsRendered コールバック
react-window のリストコンポーネントは、現在レンダリングされているアイテムのインデックスを通知する onItemsRendered コールバックを受け取ります。このコールバックから、表示範囲と overscan 範囲の開始・終了インデックスを取得できます。
このコールバックはスクロール処理への接続点です。生のスクロールイベントを設定しなくても、ユーザーがリストをどこまでスクロールしたかを検知できます。
itemCount 付近の overscanStopIndex を検知する
いつ取得を開始するかを判断するには、onItemsRendered の overscanStopIndex と現在の itemCount を比較します。レンダリング範囲が読み込み済みデータの末尾に近づいたら、追加のデータが必要です。
overscan の終了インデックスを使うと少し先回りできるため、ユーザーが最後の行に実際に到達する少し前に取得を開始できます。
末尾付近で取得を開始する
終了インデックスがしきい値を超えたら、たとえば itemCount の画面1つ分以内に入ったら、次のページを取得する関数を呼び出します。複数のリクエストが重複して実行されないように制御してください。
ローディングフラグを使うか、取得処理がすでに進行中かを確認することで、ユーザーがトリガー範囲をスクロールしている間の重複リクエストを防げます。
最後のアイテムとしてローディングインジケーターを表示する
便利な方法として、データがまだ存在する間は itemCount を読み込み済み件数に 1 を加えた値としてレンダリングできます。追加された行にスピナーを表示すると、取得中であることを知らせられます。
新しいデータが届くと件数が増え、スピナーの行が実際のコンテンツに置き換わるため、スムーズな視覚的フィードバックになります。
react-window-infinite-loader
関連パッケージの react-window-infinite-loader を使うと、このロジックを任せられます。isItemLoaded、loadMoreItems、itemCount を指定すると、ユーザーが未読み込みの行に近づいたときにローダーを呼び出します。
読み込み済みの範囲を管理する処理や、重複した読み込み呼び出しの防止も行ってくれるため、堅牢な無限スクロールを簡単に実装できます。
取得中のプレースホルダー行
未読み込みのインデックスには、空白の代わりにプレースホルダー行やスケルトン行を表示できます。レンダー関数でそのインデックスのアイテムが読み込み済みかを確認し、未読み込みならスケルトンを表示します。
スケルトンはレイアウトを維持し、進行状況を伝えてくれるため、次のページが届くまで空白のままにするよりも優れた操作感になります。
エラー行と再試行行
データの取得は失敗することがあるため、適切にエラーを処理してください。末尾に専用のエラー行を表示し、失敗した範囲の読み込み関数を再度呼び出す再試行ボタンを配置できます。
これにより、一時的な失敗が発生してもリストを使い続けられます。また、ページ全体を再読み込みせずに復旧する明確な方法をユーザーに提供できます。
カーソルページネーションとオフセットページネーション
無限リストにデータを供給するページネーションには、一般的に2つの方式があります。オフセットページネーションではページ番号やスキップ数を指定してリクエストします。一方、カーソルページネーションでは、最後に確認したアイテムを指す不透明なカーソルより後のアイテムをリクエストします。
カーソルページネーションは、変化し続けるデータに対して一般的に信頼性が高くなります。アイテムが挿入されたときにオフセットで発生する位置のずれや重複を避けられるためです。
React Query の useInfiniteQuery と組み合わせる
React Query の useInfiniteQuery は、仮想化と自然に組み合わせられます。取得済みのページ、次のカーソル、読み込み状態やエラー状態を管理し、react-window は平坦化したページを効率的にレンダリングします。
ページを1つの配列に平坦化してリストに渡し、onItemsRendered のしきい値から fetchNextPage を呼び出します。これにより、キャッシュと再試行の機能もそのまま利用できます。
クイックチェック: 無限スクロールのトリガー条件
仮想化された無限リストで、いつ追加のデータを取得するかを確認してください。
まとめ: データ取得を伴う仮想化
無限スクロールでは、ユーザーが末尾に近づくとページを読み込みます。onItemsRendered がインデックスを通知し、overscanStopIndex と itemCount を比較することで取得のタイミングを判断できます。重複したリクエストは制御して防ぎます。
プレースホルダー行とエラー行を使い、管理処理には react-window-infinite-loader を利用してください。変化し続けるデータにはカーソルページネーションが適しています。React Query の useInfiniteQuery がページ、カーソル、状態を管理し、react-window がレンダリングを担当します。
よくある質問
「仮想化とデータ取得の組み合わせ」レッスンは無料ですか?
はい。「仮想化とデータ取得の組み合わせ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。
「仮想化とデータ取得の組み合わせ」で何を学びますか?
仮想化されたリストが末尾に到達したときにデータ取得を開始し、無限スクロールを実装します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
React Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「仮想化とデータ取得の組み合わせ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このReact Academyレッスンでコードを書いて実行できますか?
はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。