一覧へ戻る
ページネーションを追加
「あれこれ」は、src/pages/journal/index.astroで全件の一覧を表示していて、記事が増えてきたのでそろそろページネーションを追加する。
ルート
ChatGPTに相談したら、最初はsrc/pages/journal/index.astroをそのまま残し、2ページ目以降を[page].astroで実装する方法を提案してくれた。
src/pages/
└── journal/
├── index.astro
├── [page].astro
└── [slug].astro
また、「paginate()を無理に使うより、自分でページングを書く方が理解しやすくて保守もしやすいと思う。」とのこと。
でも、なんとなくスッキリしない。
ClaudeとGeminiにも聞いてみると、[...page].astro(Rest parameter)を使えば、/journal、/journal/2、/journal/3…というキレイなルートになると教えてくれた。
Astro公式のRouting Referenceを確認すると、次のように書かれていた。
/posts/[page].astro→/posts/1,/posts/2,/posts/3…/posts/[...page].astro→/posts,/posts/2,/posts/3…
そこで改めて、ChatGPTに[...page].astroでいいんじゃないの?と聞くと、「実は私もその案をおすすめしたかった。」という、調子のいいそば屋の出前みたいな可愛い回答。
変更点
動的ルートファイルの作成
- src/pages/journal/index.astro
+ src/pages/journal/[...page].astro
getStaticPathsとpaginate()
---
import type { GetStaticPaths } from "astro";
export const getStaticPaths = (async ({ paginate }) => {
const journals = await getCollection("journals");
journals.sort(
(a, b) => b.data.pubDate.getTime() - a.data.pubDate.getTime(),
);
// 1ページあたり10件に分割
return paginate(journals, { pageSize: 10 });
}) satisfies GetStaticPaths;
// Astro.propsからpageオブジェクトを受け取る
const { page } = Astro.props;
---
試しに{ pageSize: 3 }にして動作確認すると、ちゃんと3件ずつページネーションされていた。{ pageSize: 10 }へ戻してコミット。
これで「あれこれ」が増えても安心。