AdaptTable for MUI

Row and column virtualization in MUI

Compose virtualize() and the table renders the rows in view plus a small overscan, whatever the dataset's size. virtualize({ virtualizeColumns: true }) does the same across, for column sets far wider than the window.

The header stays pinned, pinned columns stay put, and the scroll box scrolls — never the page. Sorting, filtering and selection keep working on the whole dataset rather than on what is drawn.

Nothing about the markup changes: it is the same MUI table, with the rows outside the window absent rather than hidden.

The scroll box is a plain Box rather than MUI's TableContainer, whose own horizontal overflow would trap the sticky header; the header sticks per TableCell against the paper background, and the rows outside the window are spacer TableRows.

The code

import { DataTable } from "@adapttable/mui";
import { virtualize } from "@adapttable/mui/virtualize";

export function Ledger({ rows, columns }) {
  return (
    <DataTable
      data={rows}
      columns={columns}
      rowKey={(row) => row.id}
      features={[virtualize({ virtualizeColumns: true })]}
      maxHeight={600}
      defaultColumnLayout={{ pinned: { name: "start" } }}
    />
  );
}

Install

pnpm add @adapttable/mui @adapttable/core @mui/material

The same feature in the other kits

More MUI features

Reference: virtualization. More of this kit: AdaptTable for MUI, or the live demo.