Skip to content

Data Grid - Sorting

Sorting allows ordering records in the data grid.

Basic sorting

Single column sorting can be triggered with by clicking a column header. Repeat this action to change the sorting direction.

A sorted column can be can pre-configured using the sortModel prop of the GridColDef interface:

<DataGrid
  {...data}
  sortModel={[
    {
      field: 'commodity',
      sort: 'asc',
    },
  ]}
/>

Custom comparator

The grid handles sorting and applies different comparators in columns according to their types. The component handles sorting natively for the following types:

  • string
  • number
  • date
  • dateTime

To extend or modify this behavior in a specific column, you can pass in a custom comparator, and override the sortComparator prop of the GridColDef interface.

In the example below, the username column combines name and age, but it is sorted by age using a custom comparator:

<DataGrid sortModel={sortModel} rows={rows} columns={columns} />

Sort order

By default, the sort order cycles between these three different modes:

const sortingOrder = ['asc', 'desc', null];

In practice, when you click a column that is not sorted, it will sort ascending (asc). The next click will make it sort descending (desc). Another click will remove the sort (null), reverting to the order that the data was provided in. This behavior can be overwritten by setting the sortingOrder prop.

In the example below columns are only sortable in descending or ascending order.

<DataGrid
  sortingOrder={['desc', 'asc']}
  sortModel={[
    {
      field: 'commodity',
      sort: 'asc',
    },
  ]}
  {...data}
/>

Disable sorting

By default, all columns are sortable. This can be revoked using the sortable prop of the GridColDef interface:

const columns: GridColDef = [{ field: 'name', sortable: false }];
<DataGrid
  {...data}
  columns={data.columns.map((column) => ({
    ...column,
    sortable: false,
  }))}
/>

Server-side sorting

By default, sorting works client-side. To switch it to server-side, set sortingMode="server". Then you need to handle the onSortModelChange callback, sort the rows on the server-side, and update the rows prop with the newly sorted rows.

<DataGrid
  rows={rows}
  columns={data.columns}
  sortingMode="server"
  sortModel={sortModel}
  onSortModelChange={handleSortModelChange}
  loading={loading}
/>

Multi-column sorting

You can sort by multiple columns at the same time using XGrid. Hold the CTRL key down while clicking the column header.

<XGrid
  {...data}
  sortModel={[
    {
      field: 'commodity',
      sort: 'asc',
    },
    {
      field: 'desk',
      sort: 'desc',
    },
  ]}
/>

apiRef

The grid exposes a set of methods that enables all of these features using the imperative apiRef.

⚠️ Only use this API when you have no alternative. Always start from the declarative API that the grid exposes.

  • getSortModel: Get the sort model currently applied to the grid.
  • setSortModel: Set the sort model and trigger the sorting of rows.
  • onSortModelChange: Callback fired when the column sorting changed before the grid has sorted its rows.