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
1MagdalenStephonDickensKobe.Reinger41@yahoo.com3578 O'Hara Road54102-7502Port AryannashireTexasKazakhstan
2RomaineJaleelO'HaraCollin.Douglas42@yahoo.com41378 Oak Street24087-7020ReynoldslandNew YorkFinland
3TaraArmandoBergstromJamel.Ullrich99@gmail.com89011 Water Lane93717ChicopeeOregonIceland
4TimothyNettieAbbott-OsinskiLilliana.McLaughlin@gmail.com64534 Wyatt Causeway40801TedfortMichiganZimbabwe
5LeanneGordonRathMonty_Nader-Weber@hotmail.com879 Common Lane40693-8140CaldwellNorth CarolinaAzerbaijan
6MuhammadDeonGutmannAbigayle91@yahoo.com211 Rowan Close14607RosalynfieldNew JerseyPanama
7EmoryEstaUllrichRonaldo.Kertzmann@yahoo.com82018 Odessa Landing76243-9381SanfordburghFloridaChad
8BryonWyattFerryEvans26@gmail.com94327 Candelario Port55076-4807Fort ChaimviewNorth DakotaGuatemala
9GregoriaArnoAltenwerthMara85@hotmail.com6851 Adams Expressway67543North CruzOhioSierra Leone
10DeondreMayaLindgrenEunice.Bayer91@hotmail.com21556 Megane Hill13742GerardtownKansasIraq
11EvaHaileyRobertsCyril55@hotmail.com4663 Willow Road69026East BrodytownMichiganMorocco
12DarleneMaxieLarkinKyle_Kuvalis@yahoo.com7333 Ryley Orchard93784-8466Port CharlotteMissouriGuinea-Bissau
13VaughnAndreThiel-KuhnMariam_Auer@gmail.com13523 Carol Crossing12647Lake OdielandConnecticutMalta
14WoodrowAlfredoWittingAmalia_Koelpin@yahoo.com59121 N 5th Street31231East KaileemouthDelawareCuracao
15SarahMariahOrnConrad.Hilll@gmail.com4887 W Park Street64252TaylorColoradoMalaysia

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