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 の相談をする!