본문 바로가기
개발/React

React Material - Mui Table 옵션 설정하기 (Customizing Material React Table)

by 피로물든딸기 2023. 4. 12.
반응형

리액트 전체 링크

 

참고

- 예제 확인 링크

- install

- basic example

- column options

- Mui Table 세로 줄 변경하기

 

테이블을 사용하기 위해 npm으로 mui table을 설치하자.

npm install material-react-table

 

가장 기본적인 예제로 만들어진 MaterialReactTable을 사용해보자.

import React, { useMemo } from 'react';
import MaterialReactTable from 'material-react-table';

//nested data is ok, see accessorKeys in ColumnDef below
const data = [
  {
    name: {
      firstName: 'John',
      lastName: 'Doe',
    },
    address: '261 Erdman Ford',
    city: 'East Daphne',
    state: 'Kentucky',
  },
  {
    name: {
      firstName: 'Jane',
      lastName: 'Doe',
    },
    address: '769 Dominic Grove',
    city: 'Columbus',
    state: 'Ohio',
  },
  {
    name: {
      firstName: 'Joe',
      lastName: 'Doe',
    },
    address: '566 Brakus Inlet',
    city: 'South Linda',
    state: 'West Virginia',
  },
  {
    name: {
      firstName: 'Kevin',
      lastName: 'Vandy',
    },
    address: '722 Emie Stream',
    city: 'Lincoln',
    state: 'Nebraska',
  },
  {
    name: {
      firstName: 'Joshua',
      lastName: 'Rolluffs',
    },
    address: '32188 Larkin Turnpike',
    city: 'Charleston',
    state: 'South Carolina',
  },
];

const MaterialTable = () => {
  //should be memoized or stable
  const columns = useMemo(
    () => [
      {
        accessorKey: 'name.firstName', //access nested data with dot notation
        header: 'First Name',
      },
      {
        accessorKey: 'name.lastName',
        header: 'Last Name',
      },
      {
        accessorKey: 'address', //normal accessorKey
        header: 'Address',
      },
      {
        accessorKey: 'city',
        header: 'City',
      },
      {
        accessorKey: 'state',
        header: 'State',
      },
    ],
    [],
  );

  return <MaterialReactTable columns={columns} data={data} />;
};

export default MaterialTable;

 

columns에 key와 header를 설정하고, data를 넣어주기만 하면 된다.

기본적인 Table임에도 Sort, Filter, Pagination 기능이 들어가있다.


Column Options

 

muiTablePaperProps는 그림자 효과, 너비, border 등을 설정할 수 있다.
아래는 elevation으로 그림자 효과를 주었고, margin: "0 auto"로 테이블을 가운데로 오게 설정하였다.
그리고 너비를 70%, 외각에 검은색 선 효과를 주는 옵션이다.

    <MaterialReactTable
      muiTablePaperProps={{
        elevation: 10, // shadow effect
        sx: {
            margin: "0 auto",
            width: "70%",
            border: "1px solid black",
        }
      }}
      columns={columns}
      data={data}
    />

 

Table의 Head만 수정하고 싶다면 muiTableHeadCellProps 컴포넌트를 수정한다.

    <MaterialReactTable
      muiTableHeadCellProps={{
        sx: {
          backgroundColor: "yellow",
          BorderStyle: "solid",
          borderWidth: "1px 0px 1px 0px",
          borderColor: "black black black black"
        },
      }}
      muiTablePaperProps={{
        elevation: 10, // shadow effect
        sx: {
            margin: "0 auto",
            width: "80%",
            border: "1px solid black",
        }
      }}

      columns={columns}
      data={data}
    />

 

그 외 기능을 추가하는 방법도 있다. 

예를 들어 enablePinning(v2 enableColumnPinning) MaterialReactTable에 추가하면 고정 기능을 사용할 수 있게 된다.

 

추가로 옵션을 더 보고 싶다면 column options를 참고하자.


Cell 관리하기

 

columns에서 Cell의 너비를 조정할 수 있다.

size를 추가하면 되지만 최소값보다 줄어들지는 않는다.

  const columns = useMemo(
    () => [
      {
        accessorKey: "name.firstName", //access nested data with dot notation
        header: "First Name",
        size: 200,
      },

 

또한 column options에는 Cell을 관리하는 여러 방법이 있다.

 

예를 들어 State 값을 모두 빨간색으로 만들어보자.

State header에 아래의 코드를 추가해보고 로그를 확인해보자.

      {
        accessorKey: "state",
        header: "State",
        Cell: ({ cell, column, renderedCellValue, row, table }) => console.log({ cell, column, renderedCellValue, row, table })
      },

 

cell, column 등 해당 라인에 대한 여러 정보를 알 수 있다.

 

여기서 renderCellValue가 테이블에 적혀있는 값이므로 아래와 같이 수정하면 State를 빨갛게 만들 수 있다.

      {
        accessorKey: "state",
        header: "State",
        Cell: ({ renderedCellValue }) => {
          return <span style={{ color: "red" }}>{renderedCellValue}</span>;
        },
      },

 

결과는 다음과 같다.

 

만약에 Last Name이 Doe인 경우만 City를 파랗게 만들고 싶다면?

이 경우는 renderedCellValue로만 처리할 수 없으므로, row를 추가로 이용한다.

row_valuesCache에서 다른 Header의 값을 알 수 있다.

 

예시는 다음과 같다.

  const makeBlue = (city, name) => {
    if (name === "Doe") return <span style={{ color: "blue" }}>{city}</span>;
    return city;
  };
  
  ...
  
      {
        accessorKey: "city",
        header: "City",
        Cell: ({ renderedCellValue, row }) =>
          makeBlue(renderedCellValue, row._valuesCache["name.lastName"]),
      },

 

이제 Last Name이 Doe인 경우City의 글자색이 파란색으로 설정된다.

 

마지막으로 한 칸 건너뛰면서 배경색을 바꾸고 싶다면 muiTableBodyProps에 아래의 내용을 추가하면 된다.

  <MaterialReactTable
    ...

    muiTableBodyProps={{
      sx: {
        //stripe the rows, make odd rows a darker color
        '& tr:nth-of-type(odd)': {
          backgroundColor: 'skyblue',
        },
      },
    }}

    columns={columns}
    data={data}
    enablePinning
  />

 

전체 코드는 다음과 같다.

import React, { useMemo } from "react";
import MaterialReactTable from "material-react-table";

//nested data is ok, see accessorKeys in ColumnDef below
const data = [
  {
    name: {
      firstName: "John",
      lastName: "Doe",
    },
    address: "261 Erdman Ford",
    city: "East Daphne",
    state: "Kentucky",
  },
  {
    name: {
      firstName: "Jane",
      lastName: "Doe",
    },
    address: "769 Dominic Grove",
    city: "Columbus",
    state: "Ohio",
  },
  {
    name: {
      firstName: "Joe",
      lastName: "Doe",
    },
    address: "566 Brakus Inlet",
    city: "South Linda",
    state: "West Virginia",
  },
  {
    name: {
      firstName: "Kevin",
      lastName: "Vandy",
    },
    address: "722 Emie Stream",
    city: "Lincoln",
    state: "Nebraska",
  },
  {
    name: {
      firstName: "Joshua",
      lastName: "Rolluffs",
    },
    address: "32188 Larkin Turnpike",
    city: "Charleston",
    state: "South Carolina",
  },
];

const MaterialTable = () => {
  const makeBlue = (city, name) => {
    if (name === "Doe") return <span style={{ color: "blue" }}>{city}</span>;
    return city;
  };

  //should be memoized or stable
  const columns = useMemo(
    () => [
      {
        accessorKey: "name.firstName", //access nested data with dot notation
        header: "First Name",
        size: 200,
      },
      {
        accessorKey: "name.lastName",
        header: "Last Name",
      },
      {
        accessorKey: "address", //normal accessorKey
        header: "Address",
      },
      {
        accessorKey: "city",
        header: "City",
        Cell: ({ renderedCellValue, row }) =>
          makeBlue(renderedCellValue, row._valuesCache["name.lastName"]),
      },
      {
        accessorKey: "state",
        header: "State",
        Cell: ({ renderedCellValue }) => {
          return <span style={{ color: "red" }}>{renderedCellValue}</span>;
        },
      },
    ],
    []
  );

  return (
    <MaterialReactTable
      muiTableHeadCellProps={{
        sx: {
          backgroundColor: "yellow",
          BorderStyle: "solid",
          borderWidth: "1px 0px 1px 0px",
          borderColor: "black black black black",
        },
      }}
      muiTablePaperProps={{
        elevation: 10, // shadow effect
        sx: {
          margin: "0 auto",
          width: "80%",
          border: "1px solid black",
        },
      }}
      muiTableBodyProps={{
        sx: {
          //stripe the rows, make odd rows a darker color
          "& tr:nth-of-type(odd)": {
            backgroundColor: "skyblue",
          },
        },
      }}
      columns={columns}
      data={data}
      enablePinning
    />
  );
};

export default MaterialTable;

 

결과는 링크에서 확인하자.

반응형

댓글