🚀 新規事業
pagination-component
最終更新 2026年05月09日 / 40_新規事業/SCALE_Build/カタログ/機能集/pagination-component.md
ページネーション部品
用途
前/次 + ページ番号表示。1...5 6 7 ...100 形式の省略表示対応。
特徴
- 前/次ボタン
- ページ番号
- 省略表示(...)
- モバイル対応
コード(コピペ用)
export function Pagination({
page, totalPages, onChange,
}: {
page: number; totalPages: number; onChange: (p: number) => void;
}) {
if (totalPages <= 1) return null;
// 表示ページ計算: 1, 2, ..., current-1, current, current+1, ..., last-1, last
const pages = new Set<number>();
pages.add(1); pages.add(totalPages);
for (let i = page - 1; i <= page + 1; i++) {
if (i >= 1 && i <= totalPages) pages.add(i);
}
const sorted = [...pages].sort((a, b) => a - b);
const items: (number | '...')[] = [];
for (let i = 0; i < sorted.length; i++) {
items.push(sorted[i]);
if (i < sorted.length - 1 && sorted[i + 1] - sorted[i] > 1) items.push('...');
}
return (
<div style={{ display: 'flex', gap: '.35rem', alignItems: 'center' }}>
<button onClick={() => onChange(Math.max(1, page - 1))} disabled={page === 1}>←</button>
{items.map((it, i) => it === '...' ? (
<span key={'el-' + i} style={{ padding: '0 .5rem', color: '#71717a' }}>…</span>
) : (
<button key={it} onClick={() => onChange(it)}
style={{ fontWeight: it === page ? 700 : 400, color: it === page ? '#a5b4fc' : 'inherit' }}>
{it}
</button>
))}
<button onClick={() => onChange(Math.min(totalPages, page + 1))} disabled={page === totalPages}>→</button>
</div>
);
}
使い方
対象プロジェクトに該当ファイルをコピーして、props を流し込むだけ。
注意事項
- 依存パッケージを忘れず追加