0Pricing
React Academy · Leçon

Défilement infini et pagination avec useInfiniteQuery

Récupérez des données paginées et chargez de nouvelles pages sans rupture avec useInfiniteQuery.

Défilement infini et pagination avec useInfiniteQuery est une leçon React Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage React Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours React Academy comprend 4 leçons au total.

Bienvenue

Dans cette leçon, vous utiliserez useInfiniteQuery pour récupérer des données paginées et mettre en œuvre un défilement infini qui charge de nouvelles pages au fur et à mesure que l’utilisateur fait défiler la page.

Qu’est-ce que useInfiniteQuery ?

useInfiniteQuery récupère les données sous forme de « pages ». Chaque page est récupérée séparément, puis ajoutée à la liste mise en cache. Il fournit les utilitaires fetchNextPage, hasNextPage et isFetchingNextPage.

Configuration de base

Définissez initialPageParam et getNextPageParam. queryFn reçoit le pageParam actuel et doit renvoyer une page de résultats.
const { data, fetchNextPage, hasNextPage } = useInfiniteQuery({
  queryKey: ['posts'],
  queryFn: ({ pageParam }) =>
    fetch('/api/posts?cursor=' + pageParam).then(r => r.json()),
  initialPageParam: 0,
  getNextPageParam: (lastPage) => lastPage.nextCursor ?? undefined,
});

getNextPageParam

getNextPageParam reçoit la dernière page récupérée et toutes les pages. Renvoyez le curseur ou le numéro de la page suivante, ou undefined/null pour signaler qu’il n’y a plus de pages (ce qui définit hasNextPage sur false).
getNextPageParam: (lastPage, allPages) => {
  return lastPage.hasMore ? lastPage.nextCursor : undefined;
}

Afficher toutes les pages

data.pages est un tableau de résultats paginés. Aplatissez-le pour afficher tous les éléments dans une liste continue.
const allPosts = data.pages.flatMap(page => page.items);

return (
  <ul>
    {allPosts.map(post => <li key={post.id}>{post.title}</li>)}
  </ul>
);

Bouton Charger davantage

Ajoutez un bouton « Charger davantage » qui appelle fetchNextPage. Désactivez-le lorsqu’il n’y a plus de pages ou qu’une récupération est en cours.
<button
  onClick={() => fetchNextPage()}
  disabled={!hasNextPage || isFetchingNextPage}
>
  {isFetchingNextPage ? 'Loading...' : hasNextPage ? 'Load More' : 'No more posts'}
</button>

Défilement infini avec IntersectionObserver

Attachez un IntersectionObserver à une div sentinelle située en bas de la liste. Lorsqu’elle entre dans la fenêtre d’affichage, appelez automatiquement fetchNextPage.
const observerRef = useRef();
useEffect(() => {
  const observer = new IntersectionObserver(entries => {
    if (entries[0].isIntersecting && hasNextPage) fetchNextPage();
  });
  if (observerRef.current) observer.observe(observerRef.current);
  return () => observer.disconnect();
}, [hasNextPage, fetchNextPage]);

<div ref={observerRef} />  {/* sentinel at bottom */}

Défilement infini bidirectionnel

Pour les applications de discussion, prenez en charge le défilement dans les deux directions : fetchNextPage pour les messages plus anciens et getPreviousPageParam/fetchPreviousPage pour les messages plus récents.

Pagination par pages ou par curseur

Pagination par décalage ou par page : initialPageParam=1, et getNextPageParam renvoie lastPage.page + 1. Pagination par curseur : utilisez l’identifiant du dernier élément comme curseur. La pagination par curseur est plus stable pour les données en temps réel.
// Offset-based
getNextPageParam: (lastPage) => lastPage.page + 1

Nouvelle récupération des requêtes infinies

L’appel d’invalidateQueries sur une requête infinie ne récupère à nouveau que la première page. Pour récupérer toutes les pages (par exemple, après l’ajout d’une nouvelle publication), utilisez queryClient.resetQueries ou refetchType: 'all'.

Vérification rapide

Que doit renvoyer getNextPageParam pour signaler qu’il n’y a plus de pages à charger ?

Récapitulatif

useInfiniteQuery accumule les pages dans data.pages. Aplatissez-les avec flatMap pour les afficher. Utilisez getNextPageParam en lui faisant renvoyer undefined pour arrêter. Déclenchez fetchNextPage lors d’un clic sur un bouton ou avec IntersectionObserver pour mettre en place un défilement infini.

Cours terminé

Félicitations ! Vous avez terminé **React Query: Server State Management**. Vous pouvez maintenant récupérer, mettre en cache, modifier, paginer les données et utiliser le défilement infini avec TanStack Query.

Questions Fréquemment Posées

La leçon « Défilement infini et pagination avec useInfiniteQuery » est-elle gratuite ?

Oui — le texte complet de « Défilement infini et pagination avec useInfiniteQuery » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours React Academy, passe à CoddyKit PRO. Le cours React Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Défilement infini et pagination avec useInfiniteQuery » ?

Récupérez des données paginées et chargez de nouvelles pages sans rupture avec useInfiniteQuery. Tu pratiques React Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer React Academy ?

Aucune expérience préalable n'est requise. React Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Défilement infini et pagination avec useInfiniteQuery » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon React Academy ?

Oui. Chaque leçon React Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Configurer React Query et QueryClient
  2. Mise en cache, durée de fraîcheur et récupération en arrière-plan
  3. Mutations avec useMutation
  4. Défilement infini et pagination avec useInfiniteQuery
← Retour à React Academy