MUI(Material UI)のDataGridで表示値と検索時の値を一致させる方法

ReactのUIフレームワークであるMUI(Material UI)のDataGridにて、セルに表示させている値と検索時の値を一致させる方法になります。

![mui.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/504f7ae2-b270-3bc1-bd2b-5fdfbae3d6f3.png)

## DataGridのrenderCellでセルの表示を自由に変えられる
MUIのDataGridでは`renderCell`を使うことで、セル内の表示を自由に変えることができます。

```tsx
renderCell: ({ row }: GridRenderCellParams) => `${row.age}歳`
```

```tsx
renderCell: ({ row }: GridRenderCellParams) => {
  let role
  switch (row.role) {
    case 0: {
      role = '管理者'
      break
    }
    case 1: {
      role = '編集者'
      break
    }
    default: {
      role = '閲覧者'
    }
  }
  return role
}
```
例えば、APIで取得した`status`の値に対して表示する値を変えることも可能です。

```tsx
renderCell: ({ row }: GridRenderCellParams) => <MyComponent age={row.age} />
```

独自のコンポーネントを返すこともできます。

## 検索時の値とずれてしまう
上記のように表示する値を変えてしまうと、MUIのフィルター機能を使う時にズレが出てしまいます。
元の値に対して検索をかける為です。下記の画像のようなイメージです。

![mui.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/3de2826d-7fa4-fc2b-9cf0-e1aae0c0ead0.png)

![mui2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/34383be8-293c-b217-984c-fb1a6c957560.png)

DataGridに設定している元々の値と表示させている値が違っているので検索にヒットしません。

## 表示値と検索時の値を一致させる

DataGridの`valueGetter`に値をセットさせることで、表示させている値と検索時の値を一致させることができます。

```tsx
valueGetter: ({ row }: GridValueGetterParams) => `${row.age}歳`
```

![mui4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/047b5792-f1b6-1bd0-e1fe-3a585479bdab.png)


```tsx
valueGetter: ({ row }: GridValueGetterParams) => {
  let role
  switch (row.role) {
    case 0: {
      role = '管理者'
      break
    }
    case 1: {
      role = '編集者'
      break
    }
    default: {
      role = '閲覧者'
    }
  }
  return role
}
```

![mui3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/874144ec-b84b-a125-9e35-ca5558d57661.png)

## コード全体

今回のコード例の全体は下記になります。

```tsx
import { Container } from '@mui/material'
import {
  DataGrid,
  GridColDef,
  GridRenderCellParams,
  GridToolbar,
  GridValueGetterParams
} from '@mui/x-data-grid'

const Index = () => {
  const columns: GridColDef[] = [
    { field: 'id', headerName: 'ID', width: 90 },
    {
      field: 'name',
      headerName: '名前',
      width: 150,
      editable: true
    },
    {
      field: 'role',
      headerName: '権限',
      width: 150,
      renderCell: ({ row }: GridRenderCellParams) => {
        let role
        switch (row.role) {
          case 0: {
            role = '管理者'
            break
          }
          case 1: {
            role = '編集者'
            break
          }
          default: {
            role = '閲覧者'
          }
        }
        return role
      },
      valueGetter: ({ row }: GridValueGetterParams) => {
        let role
        switch (row.role) {
          case 0: {
            role = '管理者'
            break
          }
          case 1: {
            role = '編集者'
            break
          }
          default: {
            role = '閲覧者'
          }
        }
        return role
      }
    },
    {
      field: 'age',
      headerName: '年齢',
      width: 150,
      renderCell: ({ row }: GridRenderCellParams) => `${row.age}歳`,
      valueGetter: ({ row }: GridValueGetterParams) => `${row.age}歳`
    }
  ]

  const rows = [
    { id: 1, name: 'Ken', role: 0, age: 35 },
    { id: 2, name: 'Taro', role: 1, age: 42 },
    { id: 3, name: 'Tom', role: 2, age: 45 }
  ]
  return (
    <Container>
      <DataGrid
        rows={rows}
        columns={columns}
        components={{ Toolbar: GridToolbar }}
        autoHeight
        disableColumnFilter
        disableColumnSelector
        disableDensitySelector
        disableSelectionOnClick
        hideFooterPagination
        componentsProps={{
          toolbar: {
            showQuickFilter: true,
            quickFilterProps: { debounceMs: 500 },
            printOptions: { disableToolbarButton: true },
            csvOptions: { disableToolbarButton: true }
          }
        }}
      />
    </Container>
  )
}

export default Index

```