Paginação no React


A lógica de implementação da paginação é baseada em controlar a exibição do conteúdo (no caso posts) por página, permitindo que o usuário carregue mais conteúdo à medida que avança nas páginas.

Inicialização do estado

O estado inicial inclui um array posts para armazenar os posts exibidos na página, um array allPosts para armazenar todos os posts carregados, page para controlar a página atual e postsPerPage para determinar quantos posts são exibidos por vez.

state = {
  posts: [],
  allPosts: [],
  page: 0,
  postsPerPage: 10
};

Carregamento inicial de Posts

No método componentDidMount(), os primeiros posts são carregados utilizando a função loadPosts(), e os resultados são armazenados no estado allPosts. Inicialmente, os posts exibidos na página (posts) são definidos com base na página atual (page) e no número de posts por página (postsPerPage).

async componentDidMount() {
  await this.loadPosts();
}
 
loadPosts = async () => {
  const { page, postsPerPage } = this.state;
 
  const postsAndPhotos = await loadPosts();
  this.setState({
    posts: postsAndPhotos.slice(page, postsPerPage),
    allPosts: postsAndPhotos,
  });
}

Nota

Os posts foram obtidos por meio da API do do site JSON Placeholder.

Carregamento adicional de Posts

O método loadMorePosts é chamado quando o botão “Load more posts” é clicado. Ele calcula a próxima página a ser carregada e extrai os próximos posts do array allPosts. Esses posts são então adicionados ao array posts no estado.

loadMorePosts = () => {
  const {
    page,
    postsPerPage,
    allPosts,
    posts
  } = this.state;
  
  const nextPage = page + postsPerPage;
  const nextPosts = allPosts.slice(nextPage, nextPage + postsPerPage);
  posts.push(...nextPosts);
 
  this.setState({ posts, page: nextPage });
}

Renderização da Interface

A interface renderiza os posts atuais utilizando o componente Posts. Além disso, um botão “Load more posts” é renderizado com base na disponibilidade de mais posts para carregar (disabled={noMorePosts}). O botão só será desabilitado quando não houver mais posts para serem exibidos.

render() {
  const { posts, page, postsPerPage, allPosts } = this.state;
  const noMorePosts = page + postsPerPage >= allPosts.length;
 
  return (
    <section className="container">
      <Posts posts={posts} />
 
      <div class="button-container">
        <Button
          text="Load more posts"
          onClick={this.loadMorePosts}
          disabled={noMorePosts}
        />
      </div>
    </section>
  );
}

Essa abordagem proporciona uma experiência de paginação ao usuário, carregando mais posts conforme necessário e desabilitando o botão quando não há mais posts a serem exibidos. A lógica é estruturada de maneira a garantir uma experiência fluida e eficiente ao lidar com grandes conjuntos de dados.

Referências