MRT logoMaterial React Table

Row Virtualization Example

Material React Table has a built-in row virtualization feature (via @tanstack/react-virtual) that allows you to render a large number of rows without major performance issues that you would normally see with a large number of DOM elements.

Try out the performance of the table below with 10,000 rows! Filtering, Search, and Sorting also maintain usable performance.

Be sure to also check out the full virtualization feature guide docs to learn about both Row and Column Virtualization.

NOTE: You should only enable row virtualization if you have a large number of rows or columns. Depending on the size of the table, if you are rendering fewer than a couple dozen rows at a time, you will actually just be adding extra overhead to the table renders. Virtualization only becomes necessary when you have over 50 rows or so at the same time with no pagination or dozens of columns.

More Examples
1LafayetteIgnacioKeeblerJohann36@hotmail.com718 Lehner Brooks96204WestfieldConnecticutBelarus
2ArnoldEvansBeerRickey44@yahoo.com50587 Conroy Shores11660-2018GoyettefieldRhode IslandPortugal
3MarilouAlexandraBotsfordDax50@yahoo.com68960 Howe Mills98876-7437JohnschesterMontanaGuinea-Bissau
4AnsleyAlenaWard-TowneLorine4@hotmail.com607 N Main Avenue74332DibbertfieldMississippiBritish Indian Ocean Territory (Chagos Archipelago)
5SoledadSherwoodWuckertAurelio_Reichel6@gmail.com9785 Wisoky Bypass28832-3420Lake ShaunshireIdahoCook Islands
6MyahMaurineKeeblerArlene_Reilly@hotmail.com2118 Murray Isle88065New JoaniebergUtahSaint Kitts and Nevis
7AiyanaMitchelMooreTrace.Howell@hotmail.com8483 Lee Street47111-2172Port BlakeRhode IslandNorthern Mariana Islands
8AyanaHollisKozeyMarc.Wiegand@hotmail.com145 Torphy Parks09182North QueenfieldArkansasSlovakia
9PearlLondonConroyJaleel_Mills@hotmail.com64247 Salisbury Road75520PriceboroKentuckyGabon
10UniqueJadeSimonisDovie_Gislason73@yahoo.com5903 Pattie Club73654-5520North AnjaliCaliforniaSaint Helena
11MerlAbelardoFriesenEstel87@gmail.com11906 Harrison Street42714-5342Port HumbertoboroughSouth CarolinaUruguay
12CassieAmaraErnserAryanna24@hotmail.com940 Westfield Road07254-2414BrekkestadMaineArgentina
13SydneeAxelSteuberEliane93@yahoo.com75792 Jadon Mountains19626CambridgeHawaiiGeorgia
14GaetanoRevaHammesJarret72@hotmail.com599 Grady Creek32606-3120Port EugeneNew HampshireSomalia

Source Code

1import { useEffect, useMemo, useRef, useState } from 'react';
2import {
3 MaterialReactTable,
4 useMaterialReactTable,
5 type MRT_ColumnDef,
6 type MRT_SortingState,
7 type MRT_RowVirtualizer,
8} from 'material-react-table';
9import { makeData, type Person } from './makeData';
10
11const Example = () => {
12 const columns = useMemo<MRT_ColumnDef<Person>[]>(
13 //column definitions...
58 );
59
60 //optionally access the underlying virtualizer instance
61 const rowVirtualizerInstanceRef = useRef<MRT_RowVirtualizer>(null);
62
63 const [data, setData] = useState<Person[]>([]);
64 const [isLoading, setIsLoading] = useState(true);
65 const [sorting, setSorting] = useState<MRT_SortingState>([]);
66
67 useEffect(() => {
68 if (typeof window !== 'undefined') {
69 setData(makeData(10_000));
70 setIsLoading(false);
71 }
72 }, []);
73
74 useEffect(() => {
75 //scroll to the top of the table when the sorting changes
76 try {
77 rowVirtualizerInstanceRef.current?.scrollToIndex?.(0);
78 } catch (error) {
79 console.error(error);
80 }
81 }, [sorting]);
82
83 const table = useMaterialReactTable({
84 columns,
85 data, //10,000 rows
86 enableBottomToolbar: false,
87 enableGlobalFilterModes: true,
88 enablePagination: false,
89 enableRowNumbers: true,
90 enableRowVirtualization: true,
91 muiTableContainerProps: { sx: { maxHeight: '600px' } },
92 onSortingChange: setSorting,
93 state: { isLoading, sorting },
94 rowVirtualizerInstanceRef, //optional
95 rowVirtualizerOptions: { overscan: 5 }, //optionally customize the row virtualizer
96 });
97
98 return <MaterialReactTable table={table} />;
99};
100
101export default Example;
102

View Extra Storybook Examples