react-pagenate 押下後にページングをキャンセルする
はじめに
react-pagenateは、React上でページングUIを実装するためのライブラリです。
このライブラリでページングアイテムを押下後、特定の条件であればページングをキャンセルする処理を実装します。
実装方法
挙動に関連する実装のみ記載します。
const handleClick = (event: {
index: number | null;
selected: number;
nextSelectedPage: number | undefined;
event: object;
isPrevious: boolean;
isNext: boolean;
isBreak: boolean;
isActive: boolean;
}) => {
if (isCansel) {
// キャンセルする場合はfalseを返却
return false;
}
};
const handlePageChange = (event: { selected: number }) => {
// 処理
};
<ReactPaginate
onClick={handleClick}
onPageChange={handlePageChange}
/>
仕組み
onClick
の実行後、onPageChange
が実行されます。
onClick
の返却値がfalse
の場合、onPageChange
の実行がキャンセルされます。
onPageChangeでキャンセルできるか
forcePageを指定していない場合
onPageChange
におけるキャンセルはできません。
<ReactPaginate>
にforcePage
を指定していない場合、ページインデックスの管理は<ReactPaginate>
内部のみで行われます。
内部のページインデックス更新はonClick
後かつonPageChange
前に実行されるため、onPageChange
に到達したときには更新済みとなっています。
forcePageを指定している場合
onPageChange
ではなくonClick
によるキャンセルを推奨します。
<ReactPaginate
forcePage={pageIndex}
onClick={handleClick}
onPageChange={handlePageChange}
/>
forcePage
が指定されている場合、ページインデックスは実質的に2種類存在することになります。
1つ目はforcePage
の指定値、2つ目は<ReactPaginate>
が内部で持つ値です。
この2つは同一の値になることは保証されていません。
内部のページインデックスは、forcePage
を指定していない場合同様、onClick
後かつonPageChange
前に更新されます。
各ページ番号の要素に付与されるCSSクラスは、forcePage
の指定値ではなく内部のページインデックスと関連しています。
内部のページインデックスと等しいページ番号の<li>
には、デフォルトでselected
クラスが付与されます。
<li class="selected">
onPageChange
でキャンセルを行う場合、内部のページインデックスは直前の押下対象に更新され、画面上も直前の押下対象がアクティブなページ要素として表示されます。
しかしonPageChange
内のforcePage
更新はキャンセルされるので、両者の値が異なる状態が生じます。
この挙動を避けるため、onPageChange
ではなくonClick
によるキャンセルを推奨します。

NCDC株式会社( ncdc.co.jp/ )のエンジニアチームです。 募集中のエンジニアのポジションや、採用している技術スタックの紹介などはこちら( github.com/ncdcdev/recruitment )をご覧ください! ※エンジニア以外も記事を投稿することがあります
Discussion