React Table で実装したテーブルにページネーションを追加する


こんにちは、Gaji-Labo フロントエンドエンジニアの石垣です。

今回は、 React Table で実装したテーブルにページネーションを追加する方法を紹介します。
今回の記事のコードとプレビューは CodeSandbox にありますので、そちらもご覧ください。

ある程度のデータ量を扱うテーブルを実装する場合、ページネーションを追加することが多いと思います。
React Table にはページネーション用の hooks が用意されているため、簡単に追加することができます。

まずは基本となるページネーションなしのテーブルを実装してみます。

import { useTable } from "react-table";

const Table = ({ columns, data }) => {
  const {
    getTableProps,
    getTableBodyProps,
    headerGroups,
    rows,
    prepareRow,
  } = useTable({ columns, data });

  return (
    <table {...getTableProps()}>
      <thead>
        {headerGroups.map((headerGroup) => (
          <tr {...headerGroup.getHeaderGroupProps()}>
            {headerGroup.headers.map((column) => (
              <th {...column.getHeaderProps()}>{column.render("Header")}</th>
            ))}
          </tr>
        ))}
      </thead>
      <tbody {...getTableBodyProps()}>
        {rows.map((row) => {
          prepareRow(row);
          return (
            <tr {...row.getRowProps()}>
              {row.cells.map((cell) => (
                <td {...cell.getCellProps()}>
                  {cell.render("Cell")}
                </td>
              ))}
            </tr>
          );
        })}
      </tbody>
    </table>
  );
};

これは columns と data を受け取りテーブルを描画する基本的なコンポーネントです。
ここにページネーションを追加するには、 usePagination という hooks を追加します。

const Table = ({ columns, data }) => {
  const {
    getTableProps,
    getTableBodyProps,
    headerGroups,
    // rows,
    prepareRow,

    // ページネーション用
    page,
    canPreviousPage,
    canNextPage,
    pageOptions,
    pageCount,
    gotoPage,
    nextPage,
    previousPage,
    state: { pageIndex }
  } = useTable(
    {
      columns,
      data,
      initialState: { pageIndex: 0, pageSize: 10 } // 初期のページと表示する行数を設定
    },
    usePagination
  );

  return (
    <div>
      {/* テーブルのコード */}
      <div>
        <button onClick={() => gotoPage(0)} disabled={!canPreviousPage}>
          {"<<"}
        </button>
        <button onClick={() => previousPage()} disabled={!canPreviousPage}>
          {"<"}
        </button>
        <button onClick={() => nextPage()} disabled={!canNextPage}>
          {">"}
        </button>
        <button onClick={() => gotoPage(pageCount - 1)} disabled={!canNextPage}>
          {">>"}
        </button>
        <span>
          Page {pageIndex + 1} of {pageOptions.length}
        </span>
      </div>
    </div>
  );
};

usePagination から新たに page などの state を受け取っています。これらはページネーションの追加に必要な state や関数です。

  • page: テーブルに表示するデータ(ページネーションを追加する前は rows にデータが格納されていましたが、ページネーションを追加した後は page ごとにデータが格納されています)
  • canPreviousPage canNextPage: 前のページ、次のページに遷移できるかどうかを判定するための boolean 値
  • pageOptions: ページ数(length でページ数を取得できます)
  • gotoPage: 指定したページに遷移するための関数(ページを指定することで、そのページに遷移します)
  • nextPage previousPage: ページ遷移を行うための関数

これらの state や関数を使って、ページネーションの UI を追加しています。

関数のみが提供されているため、たとえばページネーションの見た目を変更したい場合は、 button にスタイルを当てたり UI コンポーネントライブラリを使うことで変更することができます。

また、 initialState の pageSize に渡す値を変更することで、1 ページに表示する行数を変更することができます。

これによりページネーションありのテーブルを実装することができました。

ページネーション付きテーブルのプレビューとコードのキャプチャ

おわりに

今回は、 React Table でページネーションありのテーブルを実装する方法を紹介しました。

React Table にはデフォルトでページネーション用の hooks が用意されているため、簡単に追加することができます。

ページネーションが必要なテーブルを実装する際の参考になれば幸いです。

Gaji-Labo は Next.js, React, TypeScript 開発の実績と知見があります

フロントエンド開発の専門家である私たちが御社の開発チームに入ることで、バックエンドも含めた全体の開発効率が上がります。

「既存のサイトを Next.js に移行したい」
「人手が足りず信頼できるエンジニアを探している」
「自分たちで手を付けてみたがいまいち上手くいかない」

フロントエンド開発に関わるお困りごとがあれば、まずは一度お気軽に Gaji-Labo にご相談ください。

オンラインでのヒアリングとフルリモートでのプロセス支援にも対応しています。

Next.js, React, TypeScript の相談をする!

投稿者 Ishigaki Shotaro

アシスタントエンジニアとしてHTML/CSS/JavaScriptの実装やRailsの組み込み、スタイルガイドの構築などを担当しています。 業務の中でさまざまな学びを吸収しながら、文書構造やアクセシビリティに目を向けたマークアップの学習やJavaScriptの学習などを行っています。チームに貢献できるエンジニアとなるために日々奮闘中です。