React table: trabalhando com tabelas no react [TUTORIAL]!

É muito comum utilizarmos tabelas na hora de criar um site na web para mostrar um conjunto de dados complexos, seja uma listagem de pessoas, produtos, lugares ou qualquer coisa assim. A tabela é uma ferramenta muito versátil e poderosa, porém mais complexa na hora de definir os padrões de paginação, ordenação e linhas. Por isso, criar um componente de tabela do zero não é recomendável.

Neste artigo vamos te mostrar a poderosa biblioteca React Table, que tem como objetivo sanar todos os nossos problemas relacionados à criação de tabelas, oferecendo elementos para facilitar a criação delas. 

Continue com a gente e boa leitura!

O que é o React Table?

React Table é uma biblioteca para a framework React, na qual estão reunidas várias lógicas e um layout totalmente flexível que dá autonomia para a pessoa desenvolvedora criar e estender as tabelas na sua aplicação.

Para que serve o React Table? 4 principais aplicações!

A principal utilidade do React Table é mostrar alguma coleção de dados, incluindo dados financeiros, jogos de futebol, diagnóstico médico, etc.

Aqui temos uma tabela que mostra algumas estáticas do esporte:

Exemplo de aplicação do React Table em tabelas.

Aqui está uma imagem do site Asana, que também utiliza a biblioteca:

Interface do Asana demonstrando o uso de React Table na ferramenta.

Também podemos ver o uso do React Table no recém chegado Notion, onde podemos criar uma infinidade de tabelas e coisas parecidas:

Interface do Notion, demonstrando o uso do React Table.

O famoso Google Sheets também utiliza a biblioteca em sua ferramenta:

Exemplo de tabela no Google Sheets demonstrando a utilização do React Table na ferramenta.

Além do mais, algumas empresas, como Microsoft, Amazon e Apple também utilizam a framework em seus projetos.

Conheça a história e as versões do React Table!

React Table foi criado no Github em código aberto por volta dos anos 2016. Desde lá, vem aumentando o número de seus lançamentos e criando uma comunidade extremamente engajada.

Recentemente, em 2020 a biblioteca teve um dos seus principais lançamentos, a versão 7. De acordo com o repositório, ela veio totalmente refatorada com as mais modernas lógicas e arquiteturas do React, dando um grande salto para ajudar as pessoas desenvolvedoras a criarem lógicas de tabela com mais facilidade.

A partir dessa versão, o React Table não é mais responsável por renderizar a tabela em si, a pessoa desenvolvedora deve criar o elemento da tabela conforme julgar necessário e utilizar as lógicas da biblioteca ao seu favor.

Hoje, o autor da framework deseja lançar a versão 8, que terá mais avanços para todo mundo. No entanto, ainda temos apenas alguns lançamentos alpha e nenhuma previsão de lançamento final.

Quais os principais recursos do React Table?

Os recursos básicos que o React Table oferecem são:

  • Busca na tabela ou até mesmo em coluna específica
  • Filtros e classificações
  • Carregamento de dados remotos através de API
  • Estilos separados, caso seja necessário utilizar basta chamar por demanda

Alguns dos recursos avançados são:

  • Cabeçalhos e colunas fixas
  • Suporte para edição de um dado em uma cola
  • Suporte para edição de vários dados de uma linha
  • Suporte a paginação e tabelas com lazy loading com ótimo desempenho
  • É possível exibir ou esconder colunas
  • É totalmente responsivo
  • Suporte a rolagem vertical e horizontal

Quais as vantagens de usar o React Table? Quando usar?

A principal vantagem do React Table é a sua extensibilidade. Ou seja, é muito fácil usar a biblioteca para adicionar diversos tipos de lógicas para o seu site.

Caso você precise paginar, reorganizar as linhas, filtrar por um texto, trocar o tamanho da tabela e coisas do tipo, o React Table te dá toda a base de lógica para criar uma tabela completa e, caso seja preciso criar uma nova lógica, basta que a pessoa desenvolvedora crie um plugin para esse cenário.

Recapitulando, você pode e deve usar o React Table quando:

  • Precisa utilizar recursos como paginação, filtro e ordenação de maneira rápida e fácil
  • Precisa ter um design diferente e não se importa exatamente com a lógica
  • Quer ter muita flexibilidade, podendo criar componentes e plugins para as suas próprias regras de negócio

Quais as desvantagens de usar o React table? Quando não usar? 

Considere utilizar outra biblioteca de tabelas caso você precise de um dos seguintes recursos:

  • Suporte fácil para colunas e cabeçalhos fixos
  • Suporte fácil para rolagem horizontal e vertical em dispositivos móveis (isso porque o React Table não oferece nenhuma ajuda no que diz respeito a interface da pessoa usuária e depende totalmente da pessoa desenvolvedora para criar e testar)
  • Tabelas gigantescas, como uma planilha do Google (o suporte é muito bom até tabelas medianas, mas quando diz respeito a tabelas maiores, o suporte não é tão bom)

Além disso, o componente de tabela, mesmo sendo muito útil para mostrar uma alta gama de dados complexos, tem alguns problemas com a usabilidade e experiência do usuário.

Rolamento

O rolamento da tabela, por padrão, funciona muito bem. O problema é que dificilmente vamos utilizá-lo, visto que devemos criar um componente bonito e que agrade os olhos da pessoa usuária. Por isso, é importante lembrar que, ao realizar muitas modificações em uma tabela, o scroll deve ser testado muito bem, tanto em dispositivos que permitem o toque de tela, como o contrário.

Responsividade

A responsividade é um dos grandes problemas da tabela — e provavelmente sempre vai ser. O problema principal é que não temos uma forma fácil de exibir essa quantidade de dados no celular, então a solução acaba sendo ou mudar o layout nesses dispositivos ou adicionar barras de rolagem.

Gerenciando a largura das colunas

Se em algum momento você já pensou em gerenciar por si próprio o tamanho das colunas de uma tabela, você deveria repensar essa ideia. Fato é que, para fazer isso, você precisará pensar em todos os possíveis cenários e chegará na conclusão de que era melhor só deixar o navegador fazer esse trabalho para você.

Quais as 10 principais livrarias do React table?

1. Livraria React-Virtualized

É uma biblioteca de código aberto que fornece alguns componentes para exibir tabelas e listas com um número bem grande de dados.

Vantagens

  • Performance
  • Customização elevada
  • Boa documentação
  • Comunidade bem grande

Desvantagens

  • Pode acabar atrapalhando o seu layout
  • Mesmo tendo comunidade grande, está bem parado

Principais recursos 

  • Oferece soluções já prontas
  • É ótimo para telas menores
  • Os componentes são versáteis e modulares

2. Livraria MUI-Datatables

Faz parte do grupo de componentes da primeira versão do Material Design. Tem todas as funcionalidades básicas de uma tabela, junto com o layout do style guide.

Vantagens

  • Oferece estilos e componentes já prontos
  • Tem uma ótima responsividade para qualquer dispositivo
  • É altamente configurável e bem simples de adicionar paginação, ordenação, filtro, etc.

Desvantagens

  • Não suporta a tradução utilizando bibliotecas externas
  • Não aceita muitas customizações no layout

Principais recursos 

  • Existem 3 tipos de responsividade para que a pessoa usuária escolha
  • Permite trabalhar com aparelhos móveis de uma maneira muito mais fácil

3. Livraria RC-Table

A biblioteca nova que vem ganhando espaço no Github, é leve e fácil de usar. Como algumas outras frameworks, é necessário que a pessoa desenvolvedora adicione os estilos necessários.

Vantagens

  • É leve e simples
  • Possui um sistema de filtro e busca muito bem desenhado
  • Extensa documentação com exemplos variados

Desvantagens

  • Não te dá total acesso a documentação
  • Como é uma biblioteca nova, pode ter bugs e problemas ainda não descobertos

Principais recursos 

  • Foi feito com base no sistema de mobile first
  • Tem uma ótima performance
  • Foi feita em um sistema que aceita diversos plugins

4. Livraria React-data-grid

Essa biblioteca te dá a visão de um componente totalmente tabelado. Além do mais, oferece recursos parecidos com o do Excel e ainda consegue exportar as informações em CSV e PDF.

Vantagens

  • A renderização é muito rápida
  • Tem uma edição e formatação excelente
  • Totalmente configurável e extensível

Desvantagens

  • Pode apresentar alguns bugs e problemas
  • A documentação é rasa
  • Curva de aprendizado alta

Principais recursos 

  • Pode carregar uma imensidão de dados em poucos segundos
  • Tem um design mobile first que torna a tabela visível para qualquer tela
  • Filtros e agrupamentos no estilo Excel
  • Muitas personalizações nas colunas
  • É possível exportar nos formatos CSV, PDF e Excel

5. Livraria Rsuite-table

Mais um componente bem flexível que permite a virtualização dos dados, cabeçalhos e colunas fixas, boa performance e muito mais.

Vantagens

  • Oferece vários tipos de componentes, como botões, loaders e modais
  • Tem uma documentação bem detalhada
  • Permite a utilização de recursos diferentes, como a mudança de largura das colunas, linhas expansíveis, entre outras coisas

Desvantagens

  • A estilização é complicado, pois a biblioteca já oferece algumas folhas de estilo
  • Pode ser complicado entender sobre tudo

Principais recursos 

  • Suporte para virtualização
  • Cabeçalho e colunas fixas
  • Possibilidade na mudança de largura das colunas
  • Células customizáveis
  • É possível adicionar classificações e também RTL

6. Livraria Material Table

O Material Table é provavelmente o mais famoso componente de tabelas que traz o layout do Material Design para si. Oferece diversos elementos e customizações.

Vantagens

  • A tabela é altamente adaptável ao estilo do Material Desgin
  • A documentação é fácil e compreensível
  • A comunidade e os desenvolvedores oferecem um belo suporte

Desvantagens

  • Em alguns momentos, a documentação pode não funcionar direito
  • Não oferecem documentação para Typescript

Principais recursos 

  • Muitas ações
  • Possibilidade de sobrescrita em componentes
  • Exportação de dados
  • Filtros
  • Tradução

7. Livraria React-bootstrap-table

É uma biblioteca baseada nas tabelas do Bootstrap, mas que não são dependentes da framework. Contém todos os recursos e estilos.

Vantagens

  • Altamente customizável
  • Funcional

Desvantagens

  • A documentação não é tão boa

Principais recursos 

  • Oferece recursos de edição de coluna e remoção de linha
  • É compatível com o Bootstrap 3 e 4
  • Suporta a manipulação de dados

8. Livraria Chakra-UI-Table

Componente de tabela com o style guide da biblioteca Crakra UI. Além de ser versátil, é simples e acessível para todos os públicos.

Vantagens

  • Acessibilidade
  • Simples de definir e testar
  • Boa documentação

Desvantagens

  • Por ser um componente de um style guide, fica difícil customizar o layout

Principais recursos 

  • Declaração simples
  • Modelagem dos dados é feita de maneira inteligente
  • Existem diversos estilos pré-definidos na arquitetura do sistema

9. Livraria React-super-responsive-table

A biblioteca tem como objetivo ser responsiva e garantir pro usuário final um layout diferente do comum.

Vantagens

  • É pensado em mobile first
  • É extremamente leve
  • Documentação fácil

Desvantagens

  • Realmente não tem nenhum recurso extra além da responsividade

Principais recursos 

  • Tabela realmente responsiva
  • Componentes modulares

10. Livraria React-datasheet

É basicamente um componente que cria uma tabela no estilo de planilha. Nela é possível visualizar os dados por células, colunas e linhas.

Vantagens

  • É simples de usar
  • Tem uma usabilidade bem alta

Desvantagens

  • Está há muito tempo sem receber novas atualizações
  • A comunidade ainda não é tão grande
  • Documentação não muito atualizada

Principais recursos 

  • Consegue realizar diversas ações com as células, como selecionar, copiar e deletar 
  • Opção navegar com as teclas do teclado
  • É possível utilizar componentes customizados para renderização
  • Muitas funções de callback disponíveis

Qual a melhor livraria React Table para você?

A melhor biblioteca de React Table para você é a que soluciona seus problemas de maneira rápida e fácil. Além do mais, ela deve ser flexível para você possa mexer na estrutura futuramente sem mais problemas.

O ideal hoje em dia seria escolher o React Table como framework para a sua aplicação. No entanto, caso você precise de outras funcionalidades e não de extensibilidade, pode optar por uma livraria como o Material Table, ou algo do gênero.

Importante lembrar que para cada caso e situação, as bibliotecas têm suas vantagens e desvantagens.

Quando construir a sua própria interface para a React Table?

Os principais cenários nos quais você vai precisar criar a sua própria interface para a React Table são:

  • Quando sua tabela é muito personalizada e depende de outros componentes
  • Quando você está usando as lógicas de uma tabela, mas na realidade está utilizando outras estrutura por cima
  • Tabelas de comparação, como páginas de produtos
  • Tabelas de preço

Como criar e configurar uma React Table básica? Passo a passo!

Bem, vamos deixar a teoria de lado e começar a prática. Iniciamos então criando o projeto com o React Table.

Rode o seguinte comando no seu terminal:

npx create-react-app react-table-trybe

Lembre-se que você pode colocar o nome que quiser no projeto.

Instalando o React table

Dentro da pasta do seu projeto, instale a biblioteca com o seguinte comando:

yarn add react-table

Pronto. Agora, instalaremos o Axios para recuperar os dados para a nossa tabela.

Instalando o Axios

Precisamos do Axios para chamar a nossa API REST falsa que contém os dados paginados. O site que vamos usar é esse aqui. Para instalar o Axios, rode o comando:

yarn add axios

Testando o projeto inicial

Antes de avançar, execute o comando de inicialização do projeto React:

yarn start

Se tudo ocorrer corretamente, aparecerá a seguinte tela para você:

Tela de teste inicial do projeto React.

Com isso, podemos seguir para o próximo passo.

Importando Axios e Hooks

Abra o seu editor de texto da sua preferência. No nosso caso usamos o VSCode.

No arquivo App.js que está dentro da pasta src, vamos importar o Axios e limpar o código.

import './App.css';
import axios from "axios"

function App() {
  return (
    <div className="App"></div>
  );
}

export default App;

Inicializando com o useState

Aqui criamos algumas variáveis para salvar os valores que vem da API, a partir desses valores podemos montar a nossa tabela.

import './App.css';
import { useState } from 'react';
import axios from "axios"
function App() {
  // Array com os passageiros falsos da API
  const [data, setData] = useState([])
  // Número total de páginas
  const [totalPages, setTotalPages] = useState(1)
  // Número total de passageiros
  const [totalPassengers, setTotalPassengers] = useState(1)
  return (
    <div className="App"></div>
  );
}
export default App;

Usando o Axios para buscar os dados

Nesse momento, fazemos a chamada do Axios e definimos os valores nas variáveis do React.

import './App.css';
import { useEffect, useState } from 'react';
import axios from "axios"
function App() {
  // Array com os passageiros falsos da API
  const [data, setData] = useState([])
  // Número total de páginas
  const [totalPages, setTotalPages] = useState(1)
  // Número total de passageiros
  const [totalPassengers, setTotalPassengers] = useState(1)
  // Hook para fazer a primeira chamada do componente
  useEffect(() => {
    // Função para recuperar informações da API
    axios.get("https://api.instantwebtools.net/v1/passenger?page=0&size=10")
      .then((res) => {
        // Pega e define os valores nas respectivas variáveis
        const { data, totalPages, totalPassengers } = res.data
        setData(data)
        setTotalPages(totalPages)
        setTotalPassengers(totalPassengers)
      })
  }, [])
  return (
    <div className="App"></div>
  );
}
export default App;

Com isso, já é possível iniciar a montagem da nossa tabela.

Criando componente de Tabela

Ao lado do App.js, criamos o Table.js. Nele, criaremos toda a lógica e layout da tabela.

// Table.js
function Table({ columns, data }) {
  return (
    <div>
      Tabela
    </div>
  )
}
export default Table;

Definindo as colunas

Agora, ao lado do App.js, criamos as colunas para a tabela.

import './App.css';
import { useEffect, useMemo, useState } from 'react';
import axios from "axios"
import Table from './Table';
function App() {
  ...
  // Colunas da nossa tabela
  const columns = useMemo(
    () => [
      {
        // Primeiro grupo - Informações do passageiro
        Header: "Informações do passageiro",
        // Colunas do primeiro grupo
        columns: [
          {
            Header: "Nome",
            accessor: "name"
          },
          {
            Header: "Viagens",
            accessor: "trips"
          }
        ]
      },
      {
        // Segundo grupo - Detalhes do vôo
        Header: "Detalhes do vôo",
        // Colunas do segundo grupo
        columns: [
          {
            Header: "Nome",
            accessor: "airline[0].name"
          },
          {
            Header: "País",
            accessor: "airline[0].country"
          },
          {
            Header: "Slogan",
            accessor: "airline[0].slogan"
          }
        ]
      }
    ],
    []
  );
  
  ...
  return (
    <div className="App">
      <Table columns={columns} data={data} />
    </div>
  );
}
export default App;

Nas colunas, criamos dois grupos de cabeçalho e coluna. Já nos campos acessor, adicionamos o caminho de cada valor em nosso objeto, que é deste formato:

{
      "_id": "601c2761d9d65901b92418b2",
      "name": "Vikas Rathod",
      "trips": 200,
      "airline": [
        {
          "_id": "5f22b338b8c8cbc7bc7a44af",
          "id": 20,
          "name": "Air France",
          "country": "France",
          "logo": "https://upload.wikimedia.org/wikipedia/en/thumb/e/ed/EVA_Air_logo.svg/250px-EVA_Air_logo.svg.png",
          "slogan": "Sharing the World, Flying Together",
          "head_quaters": "376, Hsin-Nan Rd., Sec. 1, Luzhu, Taoyuan City, Taiwan",
          "website": "www.evaair.com",
          "established": "1989",
          "__v": 0
        }
      ],
      "__v": 0
}

Adicionando dados às colunas com useTable

Agora, vamos adicionar dados à tabela.

// Table.js
import React from "react";
import { useTable } from "react-table";
function Table({ columns, data }) {
  // Utilizando o hook useTable e passando as colunas com os dados.
  // É retornado para a gente todas as informações necessárias para
  // montar a tabela.
  const {
    getTableProps, // propriedades da tabela
    getTableBodyProps, // propriedades do corpo da tabela
    headerGroups, // os valores de agrupamento de tabela, caso sua tabela use
    rows, // linhas da tabela baseado nos dados e colunas
    prepareRow // Prepara a linha (Essa função deve ser chamada para cada linha)
  } = useTable({
    columns,
    data
  });
  /*
    Aqui renderizamos a nossa tabela.
    Como já sabemos, o React Table não possui nenhum comportamento visual, logo,
    depende que a gente adicione os elementos e estilo.
    O React Table vai ajudar a gente a controlar os estados e lógicas da tabela.
  */
  return (
    <table {...getTableProps()}>
      <thead>
        {headerGroups.map(headerGroup => (
          <tr {...headerGroup.getHeaderGroupProps()}>
            {headerGroup.headers.map(column => (
              <th {...column.getHeaderProps()}>{column.render("Header")}</th>
            ))}
          </tr>
        ))}
      </thead>
      <tbody {...getTableBodyProps()}>
        {rows.map((row, i) => {
          prepareRow(row);
          return (
            <tr {...row.getRowProps()}>
              {row.cells.map(cell => {
                return <td {...cell.getCellProps()}>{cell.render("Cell")}</td>;
              })}
            </tr>
          );
        })}
      </tbody>
    </table>
  );
}
export default Table;

Cada linha de código tem a sua explicação, mas basicamente o que fizemos foi conectar ao hook do React Table e renderizar a tabela a partir do dados que ele nos retorna.

Visualizando o resultado da tabela

A nossa tabela, inicialmente, ficou assim:

Exemplo de tabela criada com o React Table contendo informações de passageiros, número de viagens, nome da empresa aérea, país e detalhes de vôo.

Já que a tabela não tem nenhum estilo por padrão, o resultado final ficou um pouco estranho visualmente. Porém, logo mais vamos adicionar alguns estilos nela e melhorar isso.

Filtrando nossa tabela com useFilter

Vamos adicionar o primeiro recurso à nossa tabela. Para realizar a filtragem de dados, vamos criar um campo de texto no qual o valor será pesquisado a partir do nome do passageiro.

No Table.js, adicionamos o input e sua estrutura básica.

// Table.js
// Criando o estado
const [valueInput, setValueInput] = useState("");
// Atualiza o estado quando o valor muda
const handleValueChange = e => {
  const value = e.target.value || "";
  setValueInput(value);
};
// Input element
<input
  value={valueInput}
  onChange={handleValueChange}
  placeholder={"Busca pelo nome"}
/>

Bem, já temos o nosso elemento. Agora, como fazemos para realizar o filtro?

Para isso, precisamos usar um plugin do React Table chamado useFilters.

// Table.js
const {
    getTableProps,
    getTableBodyProps,
    headerGroups,
    rows,
    prepareRow,
    setFilter // Com a passagem do hook useFilters, temos a possibilidade filtrar a tabela com a função setFilter
  } = useTable(
    {
      columns,
      data
    },
    useFilters // adicionando o hook useFilters na tabela
  );

Em nosso exemplo, vamos apenas filtrar pelo nome do passageiro. Assim, temos que passar como parâmetro tanto o nome da variável no campo de data, quanto o valor do input. Vamos atualizar a nossa função de busca:

const handleValueChange = e => {
  const value = e.target.value || undefined;
  setFilter("name", value); // Atualiza o nome filtro "name". Com isso, a tabela sabe fazer a busca e mostrar apenas elementos parecidos com esse
  setValueInput(value);
};

Até agora ficou assim:

Exemplo de tabela criada com o React Table contendo informações de passageiros, número de viagens, nome da empresa aérea, país e detalhes de vôo, com o filtro aplicado.

Pesquisando no filtro:

Exemplo de tabela criada com o React Table contendo informações de passageiros, número de viagens, nome da empresa aérea, país e detalhes de vôo, com o filtro aplicado e uma pesquisa de exemplo.

Este é apenas um exemplo simples de como filtrar a nossa tabela. Agora vamos ver como classificar a tabela.

Classificando a tabela com useSortBy

Também é muito simples adicionar ordenação na nossa tabela. Primeiro, vamos adicionar o hook useSortBy como um dos nossos plugins.

const {
    getTableProps,
    getTableBodyProps,
    headerGroups,
    rows,
    prepareRow,
    setFilter
  } = useTable(
    {
      columns,
      data
    },
    useFilters,
    useSortBy // Este hook nos ajuda a reorganizar a tabela
  );

Depois, modificamos um pouco as propriedades do cabeçalho da tabela:

<th
  {...column.getHeaderProps(column.getSortByToggleProps())}
>
  {column.render("Header")}
</th>

Pronto! Conseguimos modificar a ordenação das colunas da nossa tabela, tudo de forma automática e fácil.

Exemplo de tabela criada com o React Table contendo informações de passageiros, número de viagens, nome da empresa aérea, país e slogan, com a ordenação das colunas modificada pelo número de viagens.

Estilizando a tabela

Precisamos linkar um arquivo CSS para o nosso componente para estilizar a tabela. Basta adicionar o seguinte código à tabela:

// Table.js
import "./Table.css"

Sinta-se livre para fazer o seu próprio estilo. No nosso caso, fizemos as seguintes regras:

table {
  font-family: Arial, Helvetica, sans-serif;
  border-collapse: collapse;
  width: 100%;
}
table td, table th {
  border: 1px solid #ddd;
  padding: 8px;
}
table tr:nth-child(even){background-color: #f2f2f2;}
table tr:hover {background-color: #ddd;}
table th {
  padding-top: 12px;
  padding-bottom: 12px;
  text-align: left;
  background-color: #04AA6D;
  color: white;
}

Tabela criada no React Table com as linhas de informações já estilizadas, com fundo verde e fonte branca.

Usando o usePagination na tabela

Voltando para o início da construção do App.js. Temos a possibilidade de paginar os dados da API, passando o parâmetro page e o valor da página. Para conseguir paginar a nossa tabela devemos usar o hook usePagination e adicionar configurações para a troca da página.

Inicialmente, o nosso hook do useTable fica da seguinte maneira:

  const {
    prepareRow, // Prepara a linha (Essa função deve ser chamada para cada linha),
    pageCount, // Contador de páginas
    state: { pageIndex }, // Página atual, começando do 0
    gotoPage, // Função para mudar página
    nextPage, // Função para avançar página
    previousPage, // Função para retroceder página
    canPreviousPage, // Booleano que checa se o botão de voltar pode estar habilitado
    canNextPage // Booleano que checa se o botão de avançar pode estar habilitado
  } = useTable({
    columns,
    data,
    initialState: { pageIndex: 0 }, // Estado inicial da tabela
    manualPagination: true, // Paginação manual, ou seja, é preciso que a gente faça todo o esquema de paginação
    pageCount: totalPages, // Quantidade de páginas
  },
    usePagination // Hook para a paginação funcionar
  );

Agora, para terminar as configurações no componente de tabela, temos que colocar mais algumas propriedades, funções de useEffect e o elemento de paginação.

//Table.js
function Table({ columns, data, totalPages, fetchData }) // Adicionamos totalPages e fetchData
useEffect(() => {
  fetchData({ pageIndex }) // Vai chamar a função do pai passando a página atual da tabela
}, [fetchData, pageIndex])
// Elemento de paginação, onde tem todas as regras de avançar e retroceder
<div className="pagination">
  <button onClick={() => gotoPage(0)} disabled={!canPreviousPage}>
    {'<<'}
  </button>{' '}
  <button onClick={() => previousPage()} disabled={!canPreviousPage}>
    {'<'}
  </button>{' '}
  <button onClick={() => nextPage()} disabled={!canNextPage}>
    {'>'}
  </button>{' '}
  <button onClick={() => gotoPage(pageCount - 1)} disabled={!canNextPage}>
    {'>>'}
  </button>{' '}
  <span>
    Página{' '}
    <strong>
      {pageIndex + 1} de {pageCount}
    </strong>{' '}
  </span>
</div>

No arquivo App.js fazemos o seguinte:

// App.js
// Função callback que faz novamente a chamada para a API, passando a página da tabela
const fetchData = useCallback(({ pageIndex }) => {
  axios.get(`https://api.instantwebtools.net/v1/passenger?page=${pageIndex}&size=10`)
    .then((res) => {
      console.log(res.data)
      // Pega e define os valores nas respectivas variáveis
      const { data, totalPages, totalPassengers } = res.data
      setData(data)
      setTotalPages(totalPages)
      setTotalPassengers(totalPassengers)
    })
}, [setData, setTotalPages, setTotalPassengers])
  <Table columns={columns} data={data} totalPages={totalPages} fetchData={fetchData} />

Com tudo modificado e salvo, conseguimos testar a nossa tabela.

Exemplo de tabela criada no React Table com o usePagination aplicado.

As formas de utilizar o usePagination podem ser mais complexas e avançadas do que esta. Aqui, utilizamos apenas um exemplo simples para dar uma noção de quão poderoso o React Table consegue ser.

Conclusão

O React Table é simples, rápido e flexível. Com ele conseguimos criar diversos tipos de tabela utilizando a mesma lógica e os mesmos componentes, tudo isso de maneira bem genérica e versátil.

React Table atualmente é um dos projetos de código aberto mais populares para criação de tabelas. Isso se deve ao fato de ter uma comunidade agregadora, onde muitos contribuidores ajudam e o desenvolvedor principal sempre lança novos recursos.


Esperemos que neste artigo você tenha aprendido um pouco mais sobre como criar e evoluir uma tabela proporcionalmente atrelado aos recursos que você precisa. Quer aprender mais sobre o assunto? Leia também nosso artigo sobre HTML table: criando tabelas com HTML.