What is material-react-table?
The material-react-table npm package is a powerful and flexible data table component for React applications, built with Material-UI. It provides a wide range of features for displaying, sorting, filtering, and editing tabular data.
What are material-react-table's main functionalities?
Basic Table
This code demonstrates how to create a basic table using the material-react-table package. It defines a set of columns and data, and then renders the table with these configurations.
import React from 'react';
import MaterialReactTable from 'material-react-table';
const data = [
{ id: 1, name: 'John Doe', age: 28 },
{ id: 2, name: 'Jane Smith', age: 34 },
];
const columns = [
{ title: 'ID', field: 'id' },
{ title: 'Name', field: 'name' },
{ title: 'Age', field: 'age' },
];
const BasicTable = () => (
<MaterialReactTable
columns={columns}
data={data}
/>
);
export default BasicTable;
Sorting
This code demonstrates how to enable sorting on columns in the material-react-table. By setting the 'sorting' property to true in the column definitions, users can sort the table data by clicking on the column headers.
import React from 'react';
import MaterialReactTable from 'material-react-table';
const data = [
{ id: 1, name: 'John Doe', age: 28 },
{ id: 2, name: 'Jane Smith', age: 34 },
];
const columns = [
{ title: 'ID', field: 'id', sorting: true },
{ title: 'Name', field: 'name', sorting: true },
{ title: 'Age', field: 'age', sorting: true },
];
const SortableTable = () => (
<MaterialReactTable
columns={columns}
data={data}
options={{ sorting: true }}
/>
);
export default SortableTable;
Filtering
This code demonstrates how to enable filtering on columns in the material-react-table. By setting the 'filtering' property to true in the column definitions, users can filter the table data using input fields in the column headers.
import React from 'react';
import MaterialReactTable from 'material-react-table';
const data = [
{ id: 1, name: 'John Doe', age: 28 },
{ id: 2, name: 'Jane Smith', age: 34 },
];
const columns = [
{ title: 'ID', field: 'id', filtering: true },
{ title: 'Name', field: 'name', filtering: true },
{ title: 'Age', field: 'age', filtering: true },
];
const FilterableTable = () => (
<MaterialReactTable
columns={columns}
data={data}
options={{ filtering: true }}
/>
);
export default FilterableTable;
Editable Table
This code demonstrates how to create an editable table using the material-react-table package. By setting the 'editable' property in the column definitions, users can edit the table data directly in the table cells.
import React from 'react';
import MaterialReactTable from 'material-react-table';
const data = [
{ id: 1, name: 'John Doe', age: 28 },
{ id: 2, name: 'Jane Smith', age: 34 },
];
const columns = [
{ title: 'ID', field: 'id', editable: 'never' },
{ title: 'Name', field: 'name', editable: 'onUpdate' },
{ title: 'Age', field: 'age', editable: 'onUpdate' },
];
const EditableTable = () => (
<MaterialReactTable
columns={columns}
data={data}
editable={{
onRowUpdate: (newData, oldData, resolve) => {
// Update logic here
resolve();
},
}}
/>
);
export default EditableTable;
Other packages similar to material-react-table
material-table
material-table is a popular data table component for React that integrates with Material-UI. It offers similar functionalities to material-react-table, such as sorting, filtering, and editing. However, material-table has a larger community and more extensive documentation.
react-table
react-table is a lightweight and flexible table library for React. While it does not come with built-in Material-UI integration, it provides a highly customizable API for building tables with features like sorting, filtering, and pagination. It requires more manual setup compared to material-react-table.
mui-datatables
mui-datatables is another data table component for React that integrates with Material-UI. It offers a wide range of features, including sorting, filtering, and editing, similar to material-react-table. mui-datatables is known for its ease of use and comprehensive feature set.
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.