usePagination
Ce hook facilite la gestion de la pagination en générant automatiquement les URLs pour naviguer entre les pages. Il synchronise l'état de pagination avec l'URL, permettant de conserver la position lors de la navigation et de partager des liens vers des pages spécifiques.
Retour du hook
Le hook retourne un objet contenant :
| Propriété | Type | Description |
|---|---|---|
getPage | Function | Retourne un objet avec l'URL pour une page spécifique |
getPreviousPage | Function | Retourne un objet avec l'URL de la page précédente |
getNextPage | Function | Retourne un objet avec l'URL de la page suivante |
canPrev | boolean | Indique si une page précédente existe |
canNext | boolean | Indique si une page suivante existe |
Types
interface PaginationConfig {
current: number; // Numéro de la page actuelle
total: number; // Nombre total de pages
urlParam?: string; // Nom du paramètre d'URL (défaut: "page")
startAt?: number; // Numéro de la première page (défaut: 1)
}
Paramètres
usePagination(config: PaginationConfig)
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
current | number | ✅ | La page actuelle |
total | number | ✅ | Le nombre total de pages |
urlParam | string | ❌ | Nom du paramètre d'URL (défaut: "page") |
startAt | number | ❌ | Première page (défaut: 1) |
Utilisation basique
import { usePagination } from '@/hooks/use-pagination';
import Link from 'next/link';
export function UserList({ currentPage = 1, totalPages = 5 }) {
const { getPage, getPreviousPage, getNextPage, canPrev, canNext } = usePagination({
current: currentPage,
total: totalPages,
});
return (
<div>
<ul>
{/* Liste des utilisateurs */}
</ul>
<div style={{ marginTop: '20px' }}>
<Link href={getPreviousPage().href} className={!canPrev ? 'disabled' : ''}>
Précédent
</Link>
<span style={{ margin: '0 10px' }}>
Page {currentPage} sur {totalPages}
</span>
<Link href={getNextPage().href} className={!canNext ? 'disabled' : ''}>
Suivant
</Link>
</div>
</div>
);
}
Fonctionnement
- Lecture des paramètres : Récupère le numéro de page depuis l'URL
- Calcul des limites : Détermine si les pages précédente/suivante existent
- Génération d'URLs : Crée les URLs pour chaque action de pagination
- Persistance : Les paramètres d'URL permettent de partager des liens paginés
Paramètres d'URL
Par défaut, le hook utilise le paramètre page :
?page=1 # Page 1 (paramètre supprimé par défaut)
?page=2 # Page 2
?page=3 # Page 3
Avec un paramètre personnalisé :
const pagination = usePagination({
current: 2,
total: 10,
urlParam: 'p', // Utilise ?p=2 au lieu de ?page=2
});
Cas d'usage courants
1. Paginateur simple avec boutons
const { getPreviousPage, getNextPage, canPrev, canNext } = usePagination({
current: 1,
total: 10,
});
<>
<Link href={getPreviousPage().href} onClick={(e) => !canPrev && e.preventDefault()}>
← Précédent
</Link>
<Link href={getNextPage().href} onClick={(e) => !canNext && e.preventDefault()}>
Suivant →
</Link>
</>
2. Numéros de page
const { getPage } = usePagination({ current: 2, total: 5 });
<div>
{Array.from({ length: 5 }, (_, i) => i + 1).map((page) => (
<Link key={page} href={getPage(page).href}>
{page}
</Link>
))}
</div>
3. Pagination commençant à 0
const { canPrev } = usePagination({
current: 0,
total: 10,
startAt: 0, // La première page est 0, pas 1
});
Points importants
- ⚠️ La page 1 ne crée pas de paramètre d'URL (supprimé pour une URL propre)
- ⚠️ Les liens sont générés mais ne sont pas cliquables si la navigation est impossible
- ℹ️ Compatible avec Next.js 13+ (App Router)
- ℹ️ Utilise
usePathnameetuseSearchParamsde Next.js - ✅ Permet de partager des liens vers des pages spécifiques
- ✅ Préserve les autres paramètres d'URL lors de la pagination
Conserver les autres paramètres d'URL
// Si l'URL est ?search=test&sort=date&page=2
// Le hook préserve automatiquement search et sort lors de la pagination
const { getNextPage } = usePagination({
current: 2,
total: 10,
});
// getNextPage().href retournera: ?search=test&sort=date&page=3
Sources
- Documentation Next.js useSearchParams : https://nextjs.org/docs/app/api-reference/functions/use-search-params
- Documentation Next.js usePathname : https://nextjs.org/docs/app/api-reference/functions/use-pathname
- URLSearchParams : https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams