行選択と仮想化テーブル
チェックボックスによる行選択を追加し、TanStack TableとTanStack Virtualを組み合わせて大規模データを表示します
「行選択と仮想化テーブル」はCoddyKit上の無料React Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。
行選択の有効化
idが'select'の選択列をColumnDef配列に追加します。セルでは、row.getToggleSelectedHandler()に接続したチェックボックスを描画します。ヘッダーでは、table.getToggleAllRowsSelectedHandler()を使って全選択用のチェックボックスを描画します。
さらに、rowSelection状態とonRowSelectionChangeをuseReactTableに渡します。
選択状態の確認
row.getIsSelected()は、行が現在選択されている場合にtrueを返します。選択された行にハイライトされた背景スタイルを適用するのに適しています。
row.getIsSomeSelected()は、グループ内の一部の行だけが選択されている場合の不確定状態のチェックボックスを処理します(グループ化されたテーブルで便利です)。
選択された行の取得
table.getSelectedRowModel().rowsは、現在選択されているすべての行オブジェクトの配列を返します。各行には、元のデータオブジェクトを格納するrow.originalプロパティがあります。
これを使うと、「選択項目を削除」や「選択項目をエクスポート」のように、選択された集合を対象とする一括操作ボタンを作成できます。
一括操作UIのパターン
table.getSelectedRowModel().rows.length > 0に基づいて、操作ボタンを条件付きで描画します。行が選択されていない場合は、空の状態に対する分かりにくい操作を避けるため、一括操作ツールバーを非表示にするか無効にします。
UIには選択件数を表示します。「{count}行を選択中」と表示すれば、ユーザーは選択状況を把握できます。
テーブルを仮想化する理由
10,000行をDOMノードとして描画すると、非常に時間がかかります。ブラウザーは何千もの要素をレイアウトし、描画し、管理しなければなりません。その結果、スクロールがぎこちなくなり、初回の描画も遅くなります。
仮想化では、ビューポートに現在表示されている行だけを描画するため、DOMのサイズを大幅に削減し、パフォーマンスを向上させられます。
TanStack Virtualのインストール
@tanstack/react-tableとともに@tanstack/react-virtualをインストールします。2つのライブラリは別々ですが、互いに補完するように設計されています。TanStack Tableはデータのロジックを管理し、TanStack VirtualはDOMに描画する項目を管理します。
連携する箇所は、table.getRowModel().rowsから得られる行配列です。
useVirtualizerの設定
useVirtualizer({ count: table.getRowModel().rows.length, getScrollElement: () => tableContainerRef.current, estimateSize: () => 35 })を呼び出します。countによって仮想アイテムの数が決まり、すべてのフィルター適用後のテーブルの現在の行数と一致します。
estimateSizeは行の初期高さの見積もりを提供し、実際の高さは行の描画時に測定されます。
仮想アイテムの描画
virtualizer.getVirtualItems()を呼び出すと、現在DOMに含めるべき行だけを取得できます。この配列をmapし、table.getRowModel().rows[virtualRow.index]で実際の行を取得して、それらのtr要素だけを描画します。
各仮想アイテムには、スクロールコンテナ内で絶対位置指定するためのstartプロパティがあります。
余白用のdivの追加
正しいスクロール位置を維持するには、最初の仮想アイテムのstartと同じ高さの上部スペーサーdivと、全体のサイズから最後のアイテムのendを引いた高さの下部スペーサーdivを追加します。
これらの見えないdivが、描画されていない行が占めるはずの空間を埋めるため、スクロールバーの比率が正しく保たれます。
measureElementによる動的な行の高さ
動的な行の高さを正確に測定するには、measureElement: el => el.getBoundingClientRect().heightをuseVirtualizerに渡します。各行のrefをtr要素に設定し、仮想化機能が実際に描画された高さを測定できるようにします。
これにより、内容の異なる行(複数行のテキストや展開された行)があっても、レイアウトシフトを防げます。
すべての機能の組み合わせ
ソート、フィルタリング、ページネーション、行選択、TanStack Virtualを備えたTanStack Tableは、すべて組み合わせて利用できます。useVirtualizerに渡す行数は、アクティブなすべての行モデルがデータを処理した後のtable.getRowModel().rowsから取得します。
ページネーションを有効にした場合は、最初にページネーションを適用し、その後、現在のページの行を仮想化して、大きなページ内でも滑らかにスクロールできるようにします。
TanStack Tableの行選択
現在選択されているすべての行について、元のデータオブジェクトを返すメソッドはどれですか。
レッスンのまとめ
行選択では、getToggleSelectedHandlerを備えたチェックボックス列とrowSelection状態を使用し、table.getSelectedRowModel().rowsで選択されたデータにアクセスします。useVirtualizerによる仮想化では、getVirtualItems、スペーサーdiv、必要に応じた動的な高さ用のmeasureElementを使って、表示中の行だけを描画します。
TanStack Tableのすべての機能(ソート、フィルタリング、ページネーション、選択)は、仮想描画と自然に組み合わせられます。
よくある質問
「行選択と仮想化テーブル」レッスンは無料ですか?
はい。「行選択と仮想化テーブル」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。
「行選択と仮想化テーブル」で何を学びますか?
チェックボックスによる行選択を追加し、TanStack TableとTanStack Virtualを組み合わせて大規模データを表示します ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
React Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「行選択と仮想化テーブル」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このReact Academyレッスンでコードを書いて実行できますか?
はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。