Pagination
État de page piloté par l'URL via searchParams. Le loader découpe le jeu de données par ?page=N ; les liens font naviguer le navigateur, sans JS côté client. Rafraîchissement, partage et retour/avant fonctionnent car le numéro de page vit dans l'URL.
Astuce
Chaque paramètre ?page=N est indexable par les moteurs de recherche et mémorisable en favori — contrairement à un état local JS. Combinez pagination côté serveur et chargement infini côté client en pré-rendant la première page puis en chargeant les suivantes via fetch à partir de la même URL.
Lignes 11–20 sur 47
- #11 · Item 11
- #12 · Item 12
- #13 · Item 13
- #14 · Item 14
- #15 · Item 15
- #16 · Item 16
- #17 · Item 17
- #18 · Item 18
- #19 · Item 19
- #20 · Item 20
// Page reads ?page from searchParams; loader returns the slice +
// pagination metadata. Links carry ?page=N — no client JS, no
// state. Browser back/forward Just Works.
export async function loader({ request }) {
const url = new URL(request.url);
const page = Math.max(1, parseInt(url.searchParams.get("page") ?? "1", 10));
const start = (page - 1) * PAGE_SIZE;
return {
rows: items.slice(start, start + PAGE_SIZE),
page,
totalPages: Math.ceil(items.length / PAGE_SIZE),
};
}
// Render: <a href={"?page=" + (page - 1)}>← prev</a>