0Pricing
React Academy · Aula

Rolagem infinita e paginação com useInfiniteQuery

Busque dados paginados e carregue mais páginas de forma contínua com useInfiniteQuery.

Rolagem infinita e paginação com useInfiniteQuery é uma aula grátis de React Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de React Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de React Academy inclui 4 aulas no total.

Boas-vindas

Nesta lição, você usará useInfiniteQuery para buscar dados paginados e implementará um padrão de rolagem infinita que carrega mais páginas conforme o usuário rola a tela.

O que é useInfiniteQuery?

useInfiniteQuery busca dados em 'páginas'. Cada página é buscada separadamente e adicionada ao final da lista armazenada em cache. Ele fornece os utilitários fetchNextPage, hasNextPage e isFetchingNextPage.

Configuração básica

Defina initialPageParam e getNextPageParam. A queryFn recebe o pageParam atual e deve retornar uma 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 recebe a última página buscada e todas as páginas. Retorne o cursor/número da próxima página ou undefined/null para indicar que não há mais páginas (define hasNextPage como false).
getNextPageParam: (lastPage, allPages) => {
  return lastPage.hasMore ? lastPage.nextCursor : undefined;
}

Renderizando todas as páginas

data.pages é uma matriz de resultados de páginas. Achate-a para renderizar todos os itens como uma lista contínua.
const allPosts = data.pages.flatMap(page => page.items);

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

Botão Carregar mais

Adicione um botão “Carregar mais” que chame fetchNextPage. Desative-o quando não houver mais páginas ou quando uma busca estiver em andamento.
<button
  onClick={() => fetchNextPage()}
  disabled={!hasNextPage || isFetchingNextPage}
>
  {isFetchingNextPage ? 'Loading...' : hasNextPage ? 'Load More' : 'No more posts'}
</button>

Rolagem infinita com IntersectionObserver

Associe um IntersectionObserver a uma div sentinela na parte inferior da lista. Quando ela entrar na área visível, chame fetchNextPage automaticamente.
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 */}

Rolagem infinita bidirecional

Para aplicativos de conversa, permita a rolagem nas duas direções: use fetchNextPage para mensagens mais antigas e getPreviousPageParam/fetchPreviousPage para mensagens mais recentes.

Paginação baseada em página versus cursor

Baseada em deslocamento/página: initialPageParam=1, getNextPageParam retorna lastPage.page + 1. Baseada em cursor: use o ID do último item como cursor. A baseada em cursor é mais estável para dados em tempo real.
// Offset-based
getNextPageParam: (lastPage) => lastPage.page + 1

Atualizando queries infinitas

Chamar invalidateQueries em uma query infinita atualiza apenas a primeira página. Para atualizar todas as páginas (por exemplo, depois que uma nova publicação é adicionada), use queryClient.resetQueries ou refetchType: 'all'.

Verificação rápida

O que getNextPageParam deve retornar para indicar que não há mais páginas a carregar?

Recapitulação

useInfiniteQuery acumula as páginas em data.pages. Use flatMap para achatá-las e renderizar. Use getNextPageParam retornando undefined para parar. Acione fetchNextPage ao clicar no botão ou usando IntersectionObserver para a rolagem infinita.

Curso concluído

Parabéns! Você concluiu **React Query: Gerenciamento do Estado do Servidor**. Agora você pode buscar, armazenar em cache, alterar, paginar e rolar indefinidamente usando TanStack Query.

Perguntas Frequentes

A aula “Rolagem infinita e paginação com useInfiniteQuery” é grátis?

Sim — o texto completo de “Rolagem infinita e paginação com useInfiniteQuery” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de React Academy, atualize para CoddyKit PRO. O curso de React Academy inclui 4 aulas no total.

O que vou aprender em “Rolagem infinita e paginação com useInfiniteQuery”?

Busque dados paginados e carregue mais páginas de forma contínua com useInfiniteQuery. Você pratica React Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar React Academy?

Nenhuma experiência prévia é necessária. React Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Rolagem infinita e paginação com useInfiniteQuery”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de React Academy?

Sim. Cada aula de React Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Configurando o React Query e o QueryClient
  2. Armazenamento em cache, tempo de obsolescência e nova busca em segundo plano
  3. Mutações com useMutation
  4. Rolagem infinita e paginação com useInfiniteQuery
← Voltar para React Academy