Dans le développement d'applications front-end, la pagination et la mise en place d'un moteur de recherche performant sont des fonctionnalités couramment demandées.
Dans cet article, je vais te guider à travers la mise en place d'un moteur de recherche avec pagination en React, en utilisant Next.js.
Les fondamentaux : query params, hooks, et logique de pagination
1. Gestion des Query Params dans Next.js
Les query params sont des paramètres ajoutés à l'URL pour transmettre des informations comme la page actuelle ou le nombre d'items par page. Cela permet de conserver l'état de la pagination et des filtres entre les navigations.
Dans Next.js, la fonction useSearchParams
permet de récupérer et manipuler les query params facilement.
Exemple :
const searchParams = useSearchParams();
const page = Number(searchParams.get('page')) || 1;
const itemsPerPage = Number(searchParams.get('items-per-page')) || 5;
Ici, on extrait les paramètres page
et items-per-page
de l'URL. Si aucun paramètre n'est présent, on utilise des valeurs par défaut.
2. Utilisation des hooks useState
et useMemo
Les hooks useState
et useMemo
sont essentiels pour la gestion des états et l'optimisation des performances dans une application React.
- useState : Permet de gérer l'état local, comme la recherche utilisateur.
- useMemo : Optimise la logique de filtrage et de calcul en mémorisant les résultats, évitant ainsi des calculs coûteux à chaque rendu.
Exemple de filtre avec useMemo
:
const [query, setQuery] = useState('');
const filteredArticles = useMemo(() => {
if (!query) return posts;
return posts.filter(item =>
item.metadata.title.toLowerCase().includes(query.toLowerCase()) ||
item.metadata.summary.toLowerCase().includes(query.toLowerCase())
);
}, [posts, query]);
Dans cet exemple, useMemo
optimise la logique de filtrage des articles. Si la query change, l'état de la recherche se met à jour et les articles sont filtrés en fonction du titre et du résumé.
3. Logique de Pagination
La pagination permet de diviser une grande quantité de données en plusieurs pages pour faciliter la navigation. Ici, nous calculons quels articles afficher en fonction de la page courante et du nombre d'items par page.
Calcul des articles à afficher :
const start = (page - 1) * itemsPerPage;
const end = start + itemsPerPage;
const articlesToDisplay = filteredArticles.slice(start, end);
On détermine l'index de début (start
) et de fin (end
) des articles à afficher en fonction de la page et des items par page.
4. Mise en place des contrôles de pagination
Les boutons "Suivant" et "Précédent" permettent de naviguer entre les pages. Nous utilisons le hook useRouter
pour gérer la navigation avec Next.js.
Exemple de contrôles de pagination :
const PaginationControls = ({ page, hasNextPage, hasPrevPage, locale }) => {
const router = useRouter();
const searchParams = useSearchParams();
const itemsPerPage = searchParams.get('items-per-page') ?? '5';
return (
<div className='flex justify-between'>
<button
disabled={!hasPrevPage}
onClick={() => router.push(`/${locale}/blog?page=${page - 1}&items-per-page=${itemsPerPage}`)}
>
Précédent
</button>
<button
disabled={!hasNextPage}
onClick={() => router.push(`/${locale}/blog?page=${page + 1}&items-per-page=${itemsPerPage}`)}
>
Suivant
</button>
</div>
);
};
Les boutons contrôlent la navigation entre les pages tout en conservant l'état de la pagination dans les query params.
Conclusion
En combinant les hooks React (useState
, useMemo
) et les query params de Next.js, tu peux implémenter une pagination performante et un moteur de recherche efficace. La gestion des données paginées permet d'améliorer l'expérience utilisateur, surtout avec de grands volumes de données. Le concept fondamental est de toujours optimiser la performance et la lisibilité du code, surtout lorsque les utilisateurs interagissent avec un moteur de recherche en temps réel.