ZU TECH BLOG

DataGridでテーブルの要素を操作する

はじめに

こんにちは、 @zsp2088dev です。
MUIでテーブルを実装するときに、DataGridを使用することが多いと思います。
その際、テーブルの要素に対する操作を実装するかもしれません。

本記事では、DataGridを使用したテーブルの要素に対する操作の実装方法について紹介します。

今回作るもの

下記のテーブルをサンプルとして用意しました。
テーブルのカラムに名称、色、操作(編集・削除・保存)をもつ果物をまとめたテーブルです🍊

2022-05-16-table.png

テーブルの要素

果物を表すtypeとそのリストです。
DataGridではidを要素に持たなくてはなりません。

type Fruit = {
  id: number;
  name: string;
  color: string;
};

const fruits: Fruit[] = [
  { id: 1, name: "リンゴ", color: "赤" },
  { id: 2, name: "バナナ", color: "黄" },
  { id: 3, name: "ブドウ", color: "紫" },
  { id: 4, name: "キウイ", color: "緑" },
];

状態管理と要素の削除

テーブルの状態管理にReact Hooksを使用しました。
今回はサンプルとしてテーブルの要素の削除を実装しました。
実際のプロダクトであれば外部APIを使用したデータの削除が想定されると思います。

const [rows, setRows] = useState<Fruit[]>(fruits);

const deleteFruit = (id: number) => {
  setRows(rows.filter((row: Fruit) => row.id != id));
};

カラムの設定

続いてテーブルのカラムの設定についてです。
テーブルの要素に対する操作の実装方法は次にまとめます。

const columns: GridColumns<Fruit> = [
  {
    field: "name",
    headerName: "名称",
    width: 150,
  },
  {
    field: "color",
    headerName: "色",
    width: 150,
  },
  {
    field: "actions",
    type: "actions",
    headerName: "操作",
    width: 150,
    headerAlign: "center",
    align: "center",
    getActions: (params: GridRowParams) => [
      <GridActionsCellItem
        key={params.id}
        label="edit"
        showInMenu={false}
        icon={<EditIcon />}
      />,
      <GridActionsCellItem
        key={params.id}
        label="delete"
        showInMenu={false}
        icon={<DeleteIcon />}
        onClick={() => deleteFruit(params.id as number)}
      />,
      <GridActionsCellItem
        key={params.id}
        label="save"
        showInMenu={false}
        icon={<SaveAltIcon />}
        onClick={() => console.log(params.id)}
      />,
    ],
  },
];

テーブルの要素に対する操作を実装する

上記のソースコードにあるgetActionsに、GridActionsCellItemのリストを渡すことでテーブルの要素に対する操作を実装することができます。
今回は、サンプルとして3つの操作(編集・削除・保存)ボタンを実装してみました。
iconにはMaterial Iconsのコンポーネントを指定、onClickにはアイコンクリック時の操作を指定しています。

次に、@mui/x-data-gridのソースコードを見てみます。
テーブルの要素に対する操作を実装するためには、typeにactionsを、getActionsにGridActionsCellItemを指定しなくてはならないことがわかります。

export interface GridActionsColDef extends GridColDef {
    type: 'actions';
    getActions: (params: GridRowParams) => React.ReactElement<GridActionsCellItemProps>[];
}

全体のコード

最後に、今回実装したテーブルのコードがこちらです。

import {
  DataGrid,
  GridActionsCellItem,
  GridColumns,
  GridRowParams,
} from "@mui/x-data-grid";
import DeleteIcon from "@mui/icons-material/Delete";
import SaveAltIcon from "@mui/icons-material/SaveAlt";
import EditIcon from "@mui/icons-material/Edit";
import { useState } from "react";

type Fruit = {
  id: number;
  name: string;
  color: string;
};

const fruits: Fruit[] = [
  { id: 1, name: "リンゴ", color: "赤" },
  { id: 2, name: "バナナ", color: "黄" },
  { id: 3, name: "ブドウ", color: "紫" },
  { id: 4, name: "キウイ", color: "緑" },
];

const Table = () => {
  const [rows, setRows] = useState<Fruit[]>(fruits);

  const deleteFruit = (id: number) => {
    setRows(rows.filter((row: Fruit) => row.id != id));
  };

  const columns: GridColumns<Fruit> = [
    {
      field: "name",
      headerName: "名称",
      width: 150,
    },
    {
      field: "color",
      headerName: "色",
      width: 150,
    },
    {
      field: "actions",
      type: "actions",
      headerName: "操作",
      width: 150,
      headerAlign: "center",
      align: "center",
      getActions: (params: GridRowParams) => [
        <GridActionsCellItem
          key={params.id}
          label="edit"
          showInMenu={false}
          icon={<EditIcon />}
        />,
        <GridActionsCellItem
          key={params.id}
          label="delete"
          showInMenu={false}
          icon={<DeleteIcon />}
          onClick={() => deleteFruit(params.id as number)}
        />,
        <GridActionsCellItem
          key={params.id}
          label="save"
          showInMenu={false}
          icon={<SaveAltIcon />}
          onClick={() => console.log(params.id)}
        />,
      ],
    },
  ];

  return <DataGrid columns={columns} rows={rows} />;
};

export default Table;

おわり

DataGridを使用したテーブルの要素に対する操作の実装方法について紹介しました。
typeとgetActionsを指定することでサクッと実装できますが、たどり着くまでに時間がかかってしまったので、同じように悩んでいる人に本記事が届くと嬉しいです!🤗

参考

© 2022 zsp2088dev