Blog>
Snippets

Optimizing Performance in TanStack Table

Illustrate techniques for improving rendering performance in TanStack Table, such as memoization and pagination.
import { useMemo } from 'react';
import { useTable, usePagination } from 'react-table';
This imports necessary hooks from React and react-table, including useMemo for memoization and usePagination for pagination.
const data = useMemo(() => [...yourData], [yourData]);
const columns = useMemo(() => [...yourColumns], []);
Memoizes data and columns to prevent unnecessary re-renders. This is crucial for optimizing performance, especially for large data sets.
const tableInstance = useTable({ columns, data }, usePagination);
Initializes the useTable hook with columns, data, and pagination plugin. This setup provides basic pagination without rerendering the whole table on data change.
const { getTableProps, getTableBodyProps, headerGroups, prepareRow, page, nextPage, previousPage, canNextPage, canPreviousPage } = tableInstance;
Destructures necessary properties and methods from the table instance for rendering the table and handling pagination.
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()}>
      {page.map(row => {
        prepareRow(row);
        return (
          <tr {...row.getRowProps()}>
            {row.cells.map(cell => {
              return <td {...cell.getCellProps()}>{cell.render('Cell')}</td>;
            })}
          </tr>
        );
      })}
    </tbody>
  </table>
);
Renders the table structure utilizing getTableProps for the table, headerGroups for column headers, and a paginated page array for the body. This ensures only the current page's data is rendered, enhancing performance.
const fetchData = useCallback(({ pageSize, pageIndex }) => {
  // Fetch data from server here using the provided pageSize and pageIndex
}, []);
Defines a fetchData function wrapped in useCallback to prevent unnecessary recreations. This function should fetch data from a server based on the current page and page size, empowering server-side pagination for better performance.
useEffect(() => {
  fetchData({ pageIndex, pageSize });
}, [fetchData, pageIndex, pageSize]);
Utilizes useEffect to call fetchData whenever pageIndex or pageSize changes. This ensures that only the relevant slice of data is fetched and displayed, significantly improving performance by reducing the load.