MRT logoMaterial React Table

Virtualized Example

Material React Table has a built-in virtualization features (via @tanstack/react-virtual) that allows you to render a large number of rows or columns 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 and over a dozen columns! 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
1CaleMyrlGrantBuster.OKon@hotmail.com960-442-4594 x1929342 Zack Ville93827-9027Lake Rosellaville
2LynnAmaraKerlukeKylie_Little@gmail.com(920) 794-7029 x9010433 Madison Street90046-8685Yostbury
3JoannieHermannRennerTimmy_Robel90@yahoo.com1-841-975-4701 x10828261 Judd Skyway08633-6289Kozeyburgh
4RasheedFlorencioStammJalon_Bogan@hotmail.com1-391-295-9126 x6069558 Cleveland Street95472-7395North Herta
5YazminDellDeckowWalker32@hotmail.com995-916-6150 x235219436 Schulist Turnpike25999Strackeborough
6LexieViviannePourosMinerva15@gmail.com389.866.2036 x080428 Sibyl Flats77855-5846Rennerview
7ZeldaArmandMedhurstLuciano_Kling77@hotmail.com751-367-7220 x67678567 Oxford Street66475-6262Breanneton
8LaverneMeggieKohler-WiegandMorgan.Sauer64@yahoo.com438.514.9539 x5942393751 W 11th Street28885-8458Lake Buford
9MiltonAlanHodkiewiczCaleb67@hotmail.com974-543-3611 x343794 Corrine Court22661-3126Texas City
10KaleighGarrisonRiceIda.Tromp15@gmail.com(415) 595-2611269 Dejah Underpass57459Catalina Foothills
11HayleeKearaBartellAmalia_Mraz59@gmail.com1-268-943-8974 x0586136 Nicolas Ways13279-0708North Michele
12DomingoDesmondAdamsAnnabelle17@hotmail.com(534) 810-7522 x298904705 Elm Road03839Huldacester
13LizaMarleneBrown-WildermanAlexandrine.Crist89@gmail.com1-750-396-0899 x434185 Ash Close89753-7381Langoshboro
14DanykaCaterinaParker-WhiteBrooke22@yahoo.com1-634-854-2279 x6317490 Dale Street17013Bothell
15KaylahLeonoraMedhurstLeatha23@gmail.com314.712.3338 x2202772 Nannie Key46015North Clarabelle
16ColleenDonavonCassinAlberta.Bergnaum@hotmail.com(551) 275-2780 x17247347 Katherine Groves40774Providence
17IsidroGerardRobertsVickie96@yahoo.com637-508-068921456 Middle Street45998-8002Kossland

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...
90 );
91
92 //optionally access the underlying virtualizer instance
93 const rowVirtualizerInstanceRef = useRef<MRT_RowVirtualizer>(null);
94
95 const [data, setData] = useState<Person[]>([]);
96 const [isLoading, setIsLoading] = useState(true);
97 const [sorting, setSorting] = useState<MRT_SortingState>([]);
98
99 useEffect(() => {
100 if (typeof window !== 'undefined') {
101 setData(makeData(10_000));
102 setIsLoading(false);
103 }
104 }, []);
105
106 useEffect(() => {
107 //scroll to the top of the table when the sorting changes
108 try {
109 rowVirtualizerInstanceRef.current?.scrollToIndex?.(0);
110 } catch (error) {
111 console.error(error);
112 }
113 }, [sorting]);
114
115 const table = useMaterialReactTable({
116 columns,
117 data, //10,000 rows
118 defaultDisplayColumn: { enableResizing: true },
119 enableBottomToolbar: false,
120 enableColumnResizing: true,
121 enableColumnVirtualization: true,
122 enableGlobalFilterModes: true,
123 enablePagination: false,
124 enableColumnPinning: true,
125 enableRowNumbers: true,
126 enableRowVirtualization: true,
127 muiTableContainerProps: { sx: { maxHeight: '600px' } },
128 onSortingChange: setSorting,
129 state: { isLoading, sorting },
130 rowVirtualizerInstanceRef, //optional
131 rowVirtualizerOptions: { overscan: 5 }, //optionally customize the row virtualizer
132 columnVirtualizerOptions: { overscan: 2 }, //optionally customize the column virtualizer
133 });
134
135 return <MaterialReactTable table={table} />;
136};
137
138export default Example;
139

View Extra Storybook Examples