A paginação em uma página pode até parecer redundante, mas ela é um "órgão vital" para seu website, principalmente quando se trata de listas com enormes quantidades de informação, além de ser extremamente útil para acesso momentâneo, tal qual é a importância de guardar através do link as informações para chegar na mesma posteriormente.

Quando utilizamos um backend que trás o HTML processado para nós, é bem tranquilo trabalhar com elas, todavia tratando-se de SPA isso se torna um pouco chato. A parte "chata" em si não é definir a paginação, mas integrar ela ao browser de uma maneira prática e eficaz.

Adotando uma estratégia

Existe duas principais maneiras de fazer uma paginação, sendo elas:

  • Pela Query String: acrescentando ?page=2;
  • Pelo Path: acrescentando /2/.

Particularmente acho a segunda opção mais elegante e mais fácil de trabalhar, e é sobre ela que abordarei neste post. Quando eu me referir a page, estarei falando sobre o valor que fica na url /:page?/.

A primeira coisa que você precisa entender é que o valor da page pode ser opcional, sendo que quando não tiver nenhum valor é considerado como 1. Para trabalhar com valor opcional no react-router-dom sua URL precisa de uma interrogação no final da variável identificadora:

<Route path="blog/:page?" component={Blog} />

Assim você consegue trabalhar com o page direto dos match.params disponibilizados.

Paginando

Como o foco do post é a parte do browser vou considerar que você já possui o componente de paginação funcionando lisinho, e que o usuário não consegue navegar pelo histórico.

Naturalmente o componentDidMount já possui um método que faz o load dos dados mas provavelmente fixo na página 1, o que precisa ser alterado para acompanhar a page que o usuário passar ao acessar a página:

async componentDidMount() {
  const { page } = this.props.match.params;
  this.loadData(page);
}

E agora a cada page acionado pela paginação ao invés de fazer o resgate direto com o loadData é preciso mudar o page com o history.push e carregar os dados pelo componentDidUpdate, que conseguimos visualizar quais propriedades foram atualizadas e assim carregar as novas informações de acordo com a nova page:

async componentDidUpdate(prevProps) {
  const { page } = this.props.match.params;
  if ( page !== prevProps.match.params.page) {
    this.loadData(page);
  }
}

Ah, poderia colocar o loadPage junto com o history.push mas quando usasse a Arrow back do browser por exemplo não seriam atualizados os dados carregados.

Até mais

Isso é o básico para você ter uma paginação utilizando o browser e um componente de paginação com React, que pode ser adaptado para ter um filtro também.

Espero que com esses conceitos você consiga montar sua página com uma paginação show de bola.

Ah, como sempre, compartilhe com seus amigos DEVs e deixe seu comentário com dúvidas ali em baixo.

Grande abraço.