Blog>
Snippets

Optimizing Large Dataset Performance in React TanStack Table

Apply performance optimization techniques such as row virtualization and memoization to efficiently render tables with large datasets.
import { useTable, useBlockLayout } from 'react-table';
import { FixedSizeList as List } from 'react-window';
Import necessary hooks from react-table and react-window for virtualization.
const RenderRow = React.memo(({ index, style }) => {
  const row = rows[index];
  prepareRow(row);
  return (
    <div {...row.getRowProps({ style })} className="tr">
      {row.cells.map(cell => {
        return (
          <div {...cell.getCellProps()} className="td">
            {cell.render('Cell')}
          </div>
        )
      })}
    </div>
  )
});
Defines a memoized row component that only re-renders when necessary. This reduces the number of re-renders and improves performance.
const Table = ({ columns, data }) => {
  const defaultColumn = React.useMemo(
    () => ({
      width: 150, // Set a default width for each column
    }),
    []
  );

  const {
    getTableProps,
    getTableBodyProps,
    headerGroups,
    rows,
    prepareRow,
  } = useTable({
    columns,
    data,
    defaultColumn,
  },
  useBlockLayout);

  const RenderVirtualizedList = React.useMemo(() => {
    return (
      <List
        height={400}
        itemCount={rows.length}
        itemSize={35}
        width={'auto'}
      >
        {RenderRow}
      </List>
    );
  }, [rows]);

  return (
    <div {...getTableProps()} className="table">
      <div>
        {// Table header rendering not included for brevity}
      </div>
      <div {...getTableBodyProps()}>
        {RenderVirtualizedList}
      </div>
    </div>
  );
}
Creates a table component that uses `useTable` and `useBlockLayout` from react-table for layout, and uses react-window for virtualization.