Usage
Here is a brief overview of how to use Material React Table. This is a very simple example, and will not cover all features of the library, but it is a great starting point.
Setup
To start using MaterialReactTable, you first need to install material-react-table
and the necessary Material UI v5 dependencies.
There are additional steps and customizations you can do for Material UI, if you have not set it up in your application already. Check out the Material UI docs for more information.
Advanced Material UI Theming is covered in the Customize Components guide.
Import MaterialReactTable
Once you have everything installed, you can import from material-react-table
like this:
import MaterialReactTable from 'material-react-table';
If you are using TypeScript, you may also want to import some TypeScript types from 'material-react-table' to take advantage of the advanced strong type checking and autocompletion features. The MRT_ColumnDef
type is especially useful for defining your columns in a type-safe way.
import MaterialReactTable, { MRT_ColumnDef } from 'material-react-table';
Creating Data/Rows
Your data must be an array of objects that have properties matching the accessors in your column definitions. The objects themselves can theoretically be in any shape, but it will be easier to set up your columns if your data is already in a flat object format like the example below, but it is not required.
//recommended flat structure for data, but not required (nested data is fine, but takes more setup in column definitions)const data = [{name: 'John', // key "name" matches `accessorKey` in ColumnDef down belowage: 30, // key "age" matches `accessorKey` in ColumnDef down below},{name: 'Sara',age: 25,},];//a more complex example with nested dataconst data = [{person: {name: {firstName: 'John', //accessorKey or accessorFn will need to be "person.name.firstName"lastName: 'Doe',},age: 30,},},{person: {name: {firstName: 'Sara',lastName: 'Smith',},age: 25,},},];
Your data does NOT have to be created statically like this, of course. More than likely, your data is being fetched from a backend API. Check out the Remote Data example to see how you can use a remote data source.
Creating Columns
There are several different ways to define columns, depending on your needs. Let's create some basic "data" columns. That is, columns that connect to our data. Since we defined our data in a flat object format, we can simply use the accessorKey
property to access the data.
//simple column definitions pointing to flat dataconst columns = useMemo(() => [{header: 'Name',accessorKey: 'name', //simple accessorKey pointing to flat data},{header: 'Age',accessorKey: 'age', //simple accessorKey pointing to flat data},],[],);//a more complex example with nested dataconst columns = useMemo(() => [{header: 'First Name',accessorKey: 'person.name.firstName', //using accessorKey dot notation to access nested data},{header: 'Last Name',accessorFn: (originalRow) => originalRow.person.name.lastName, //alternative to accessorKey, using accessorFnid: 'lastName',},{header: 'Age',accessorKey: 'person.age',},],[],);
If you have a more nested data structure for your data, that's okay, but you will need to use more complicated accessors when you define your columns. You can learn more about that here.
Simple Example
Put it all together, and you have a basic table! You can also play around and enable some features, either per column in the column definitions, or as props passed to <MaterialReactTable />
.
import React, { useMemo } from 'react';import MaterialReactTable from 'material-react-table';//mock dataconst data = [{name: 'John',age: 30,},{name: 'Sara',age: 25,},];export default function App() {const columns = useMemo(() => [{accessorKey: 'name', //simple recommended way to define a columnheader: 'Name',muiTableHeadCellProps: { sx: { color: 'green' } }, //custom props},{accessorFn: (row) => row.age, //alternate wayid: 'age', //id required if you use accessorFn instead of accessorKeyheader: 'Age',Header: <i style={{ color: 'red' }}>Age</i>, //optional custom markup},],[],);return (<MaterialReactTablecolumns={columns}data={data}enableRowSelection //enable some featuresenableColumnOrderingenableGlobalFilter={false} //turn off a feature/>);}
Note: It is very important that the columns and data definitions are memoized or stable. Otherwise, the entire table will be re-rendered during every react re-render in your application, which can lead to performance issues. To make a variable stable, store it in
useState
, wrap it inuseMemo
, or define it outside of a component so it does not get recreated on every render.
Live Code Sandbox Example
Next Steps
There are numerous ways you can customize the behavior and look and feel of your Material React Table. View some of the examples to see how you can customize your table, and visit the props page to see all the props that you can use to turn features on and off and customize the look and feel of your table.
Also, be sure to check out both the Fundamental Guides and the Advanced Feature Guides to learn more about the different features you can toggle on and off, or customize.