Material React Table
View Documentation
About
Quickly Create React Data Tables with Material Design
Want to use Mantine instead of Material UI? Check out Mantine React Table
Learn More
Quick Examples
- Basic Table (See Default Features)
- Minimal Table (Turn off Features like Pagination, Sorting, Filtering, and Toolbars)
- Advanced Table (See some of the Advanced Features)
- Aggregation/Grouping (Aggregation features such as Sum, Average, Count, etc.)
- Data Export Table (Export to CSV, Excel, etc.)
- Editing CRUD Table (Create, Edit, and Delete Rows)
- Remote Data (Server-side Pagination, Sorting, and Filtering)
- React Query (Server-side Pagination, Sorting, and Filtering, simplified)
- Virtualized Rows (10,000 rows at once!)
- Infinite Scrolling (Fetch data as you scroll)
- Localization (i18n) (Over a dozen languages built-in)
View additional storybook examples
Features
All features can easily be enabled/disabled
Fully Fleshed out Docs are available for all features
Getting Started
Installation
View the full Installation Docs
-
Ensure that you have React 17 or later installed (MUI V5 requires React 17 or 18)
-
Install Peer Dependencies (Material UI V5)
npm install @mui/material @mui/icons-material @emotion/react @emotion/styled
- Install material-react-table
npm install material-react-table
@tanstack/react-table
, @tanstack/react-virtual
, and @tanstack/match-sorter-utils
are internal dependencies, so you do NOT need to install them yourself.
Usage
Read the full usage docs here
import React, { useMemo, useRef, useState, useEffect } from 'react';
import MaterialReactTable from 'material-react-table';
const data = [
{
name: 'John',
age: 30,
},
{
name: 'Sara',
age: 25,
},
]
export default function App() {
const columns = useMemo(
() => [
{
accessorKey: 'name',
header: 'Name',
muiTableHeadCellProps: { sx: { color: 'green' } },
Cell: ({ cell }) => <span>{cell.getValue()}</span>,
},
{
accessorFn: (row) => row.age,
id: 'age',
header: 'Age',
Header: () => <i>Age</i>,
},
],
[],
);
const [rowSelection, setRowSelection] = useState({});
useEffect(() => {
}, [rowSelection]);
const tableInstanceRef = useRef(null);
const someEventHandler = () => {
console.log(tableInstanceRef.current.getState().sorting);
}
return (
<MaterialReactTable
columns={columns}
data={data}
enableColumnOrdering //enable some features
enableRowSelection
enablePagination={false} //disable a default feature
onRowSelectionChange={setRowSelection} //hoist internal state to your own state (optional)
state={{ rowSelection }} //manage your own state, pass it back to the table (optional)
tableInstanceRef={tableInstanceRef} //get a reference to the underlying table instance (optional)
/>
);
}
Open in Code Sandbox
Contributors
PRs are Welcome, but please discuss in GitHub Discussions or the Discord Server first if it is a large change!
Read the Contributing Guide to learn how to run this project locally.