0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MUI(Material UI)のDataGridでセルとヘッダーに独自のコンポーネントを設置する方法【React】

Posted at

ReactのUIフレームワークであるMUI(Material UI)のDataGridにて、セルとヘッダーに独自のコンポーネントを設置する方法を解説していきます。
セルの中にクリックできるボタンを設置したりと色々とカスタマイズすることができます。

MUI DataGridのセルの中にコンポーネントを設置する

import { Button, Container } from '@mui/material'
import { DataGrid, GridColDef, GridRenderCellParams } from '@mui/x-data-grid'

const Home = () => {
  const columns: GridColDef[] = [
    { field: 'id', headerName: 'ID' },
    { field: 'name', headerName: 'NAME' },
    {
      field: 'email',
      headerName: 'E-MAIL',
      width: 200,
      renderCell: (params) => {
        return <RenderCellComponent {...params} />
      }
    }
  ]

  const RenderCellComponent = (params: GridRenderCellParams) => {
    const onClick = () => {
      alert(params.row.email)
    }
    return (
      <Button variant="contained" onClick={onClick} fullWidth>
        Click
      </Button>
    )
  }

  const rows = [
    {
      id: 1,
      name: 'Taro',
      email: 'test1@gmail.com'
    },
    {
      id: 2,
      name: 'Ken',
      email: 'test2@gmail.com'
    },
    {
      id: 3,
      name: 'Yui',
      email: 'test3@gmail.com'
    }
  ]

  return (
    <Container>
      <DataGrid columns={columns} rows={rows} autoHeight checkboxSelection />
    </Container>
  )
}

export default Home

columnsrenderCellにコンポーネントを返すことで独自のコンポーネントをセル内に配置することができます。
renderCellのコールバック関数でセルの情報を受け取りコンポーネントに渡すことができます。

renderCell: (params) => {
  return <RenderCellComponent {...params} />
}

今回の例ではMUIのButton Componentを配置しています。
mui-rendercell2.png

onClickなどのイベントも設定することが可能です。

mui-rendercell.png

MUI DataGridのヘッダーの中にコンポーネントを設置する

import EmailIcon from '@mui/icons-material/Email'
import { Box, Container } from '@mui/material'
import { DataGrid, GridColDef, GridColumnHeaderParams } from '@mui/x-data-grid'

const Home = () => {
  const columns: GridColDef[] = [
    { field: 'id', headerName: 'ID' },
    { field: 'name', headerName: 'NAME' },
    {
      field: 'email',
      headerName: 'E-MAIL',
      width: 200,
      renderHeader: (params: GridColumnHeaderParams) => {
        return <RenderHeaderComponent {...params} />
      }
    }
  ]

  const RenderHeaderComponent = (params: GridColumnHeaderParams) => {
    return (
      <Box display="flex" sx={{ alignItems: 'center' }}>
        <EmailIcon color="inherit" />
        <Box>{params.colDef.headerName}</Box>
      </Box>
    )
  }

  const rows = [
    {
      id: 1,
      name: 'Taro',
      email: 'test1@gmail.com'
    },
    {
      id: 2,
      name: 'Ken',
      email: 'test2@gmail.com'
    },
    {
      id: 3,
      name: 'Yui',
      email: 'test3@gmail.com'
    }
  ]

  return (
    <Container>
      <DataGrid columns={columns} rows={rows} autoHeight checkboxSelection />
    </Container>
  )
}

export default Home

mui-renderheader.png

columnsrenderHeaderにコンポーネントを返すことで、独自のコンポーネントをDataGridのヘッダー内に配置することができます。アイコンなどを一緒に表示する際などに役立つかなと思います。

renderHeaderのコールバック関数でヘッダーの情報を受け取りコンポーネントに渡すことができます。

renderHeader: (params: GridColumnHeaderParams) => {
  return <RenderHeaderComponent {...params} />
}

const RenderHeaderComponent = (params: GridColumnHeaderParams) => {
  console.log(params.colDef.headerName)
}

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?