0Pricing
React Academy · Lección

Desplazamiento infinito y paginación con useInfiniteQuery

Obtenga datos paginados y cargue más páginas sin interrupciones con useInfiniteQuery.

Desplazamiento infinito y paginación con useInfiniteQuery es una lección gratuita de React Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de React Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de React Academy incluye 4 lecciones en total.

Bienvenida

En esta lección utilizará useInfiniteQuery para obtener datos paginados e implementará un patrón de desplazamiento infinito que carga más páginas a medida que el usuario se desplaza.

¿Qué es useInfiniteQuery?

useInfiniteQuery obtiene los datos en «pages». Cada página se obtiene por separado y se añade a la lista almacenada en caché. Proporciona las utilidades fetchNextPage, hasNextPage e isFetchingNextPage.

Configuración básica

Defina initialPageParam y getNextPageParam. queryFn recibe el pageParam actual y debe devolver una página de resultados.
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 recibe la última página obtenida y todas las páginas. Devuelve el cursor o número de la página siguiente, o undefined/null para indicar que no quedan más páginas (establece hasNextPage en false).
getNextPageParam: (lastPage, allPages) => {
  return lastPage.hasMore ? lastPage.nextCursor : undefined;
}

Renderizar todas las páginas

data.pages es un array de resultados de páginas. Combínelo para renderizar todos los elementos como una lista continua.
const allPosts = data.pages.flatMap(page => page.items);

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

Botón «Cargar más»

Añada un botón «Cargar más» que llame a fetchNextPage. Desactívelo cuando no queden más páginas o haya una obtención en curso.
<button
  onClick={() => fetchNextPage()}
  disabled={!hasNextPage || isFetchingNextPage}
>
  {isFetchingNextPage ? 'Loading...' : hasNextPage ? 'Load More' : 'No more posts'}
</button>

Desplazamiento infinito con IntersectionObserver

Asocie un IntersectionObserver a un div centinela situado al final de la lista. Cuando entre en la ventana gráfica, llame automáticamente a 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 */}

Desplazamiento infinito bidireccional

En las aplicaciones de chat, admita el desplazamiento en ambas direcciones: use fetchNextPage para obtener mensajes más antiguos y getPreviousPageParam/fetchPreviousPage para obtener mensajes más nuevos.

Paginación basada en páginas frente a paginación basada en cursores

Basada en desplazamiento/páginas: initialPageParam=1 y getNextPageParam devuelve lastPage.page + 1. Basada en cursores: use el ID del último elemento como cursor. La paginación basada en cursores es más estable para datos en tiempo real.
// Offset-based
getNextPageParam: (lastPage) => lastPage.page + 1

Volver a obtener consultas infinitas

Llamar a invalidateQueries en una consulta infinita vuelve a obtener únicamente la primera página. Para volver a obtener todas las páginas (por ejemplo, después de añadir una publicación), use queryClient.resetQueries o refetchType: 'all'.

Comprobación rápida

¿Qué debe devolver getNextPageParam para indicar que no quedan más páginas por cargar?

Resumen

useInfiniteQuery acumula las páginas en data.pages. Use flatMap para combinarlas y renderizarlas. Haga que getNextPageParam devuelva undefined para detener la carga. Active fetchNextPage al hacer clic en un botón o mediante IntersectionObserver para implementar el desplazamiento infinito.

Curso completado

¡Enhorabuena! Ha terminado **React Query: Server State Management**. Ahora puede obtener, almacenar en caché, modificar, paginar y recorrer infinitamente los datos con TanStack Query.

Preguntas frecuentes

¿La lección «Desplazamiento infinito y paginación con useInfiniteQuery» es gratis?

Sí — el texto completo de «Desplazamiento infinito y paginación con useInfiniteQuery» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de React Academy, actualiza a CoddyKit PRO. El curso de React Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Desplazamiento infinito y paginación con useInfiniteQuery»?

Obtenga datos paginados y cargue más páginas sin interrupciones con useInfiniteQuery. Practicas React Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar React Academy?

No se requiere experiencia previa. React Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Desplazamiento infinito y paginación con useInfiniteQuery»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de React Academy?

Sí. Cada lección de React Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Configurar React Query y QueryClient
  2. Caché, stale time y actualización en segundo plano
  3. Mutaciones con useMutation
  4. Desplazamiento infinito y paginación con useInfiniteQuery
← Volver a React Academy