MUI v5 DataGrid 컴포넌트에 사용자 정의 편집 및 삭제 컴포넌트 추가하기

행 DataGrid MUI v5 컴포넌트에 사용자 정의 편집 및 삭제 컴포넌트 추가하기 React 앱에서 UI 라이브러리로 Material UI (MUI) v5 컴포넌트를 사용할 때, 데이터그리드(DataGrid)나 데이터그리드프로(DataGridPro) 컴포넌트 내부에 사용자 정의 편집 및 삭제 행을 만들어야 할 …

title_thumbnail(MUI v5 DataGrid에서 호버된 행에 대한 사용자 정의 편집 및 삭제 컴포넌트 달성하기)

행 DataGrid MUI v5 컴포넌트에 사용자 정의 편집 및 삭제 컴포넌트 추가하기

React 앱에서 UI 라이브러리로 Material UI (MUI) v5 컴포넌트를 사용할 때, 데이터그리드(DataGrid)나 데이터그리드프로(DataGridPro) 컴포넌트 내부에 사용자 정의 편집 및 삭제 행을 만들어야 할 때가 있습니다. 이 블로그 포스트에서는 이러한 사용자 정의 기능을 구현하는 방법과 함께 발생할 수 있는 일반적인 문제를 해결해보겠습니다.

마우스오버한 행에 편집 및 삭제 아이콘 추가하기

목표는 새 열을 추가하지 않고 기존 레이아웃에 간섭하지 않으면서 마우스오버한 행에 편집 및 삭제 아이콘을 표시하는 것입니다. 이를 위해 다음과 같은 솔루션을 살펴보겠습니다:

componentsProps={{
  row: {
    onMouseEnter: onMouseEnterRow,
    onMouseLeave: onMouseLeaveRow
  }
}}

DataGrid나 DataGridPro 컴포넌트의 componentsProps 속성을 사용하여 행에 onMouseEnteronMouseLeave 이벤트 핸들러를 추가할 수 있습니다. 이 핸들러는 마우스오버한 행을 추적하고 필요할 때 편집 및 삭제 아이콘을 표시하는 역할을 담당합니다. 곧 이벤트 핸들러의 구현에 대해 다루겠습니다.

{
  field: "actions",
  headerName: "",
  width: 120,
  sortable: false,
  disableColumnMenu: true,
  renderCell: (params) => {
    if (hoveredRow === params.id) {
      return (
        <Box
          sx={{
            backgroundColor: "whitesmoke",
            width: "100%",
            height: "100%",
            display: "flex",
            justifyContent: "center",
            alignItems: "center"
          }}
        >
          <IconButton onClick={() => console.log(params.id)}>
            <EditIcon />
          </IconButton>
          <IconButton onClick={() => console.log(params.id)}>
            <DeleteIcon />
          </IconButton>
        </Box>
      );
    } else return null;
  }
}

폭이 120픽셀인 “actions”라는 열을 정의하고, 이 열에 편집 및 삭제 아이콘이 포함될 것입니다. renderCell 함수에서 현재 행이 마우스오버한 행인지를 확인하기 위해 해당 행의 ID와 hoveredRow 변수에 저장된 값을 비교합니다. 일치하는 경우, 셀 내부에 가운데 정렬된 아이콘을 표시하는 Box 컴포넌트를 반환합니다.

이제 이벤트 핸들러를 구현해보겠습니다:

const onMouseEnterRow = (event) => {
    setHoveredRow(event.row.id);
};

const onMouseLeaveRow = () => {
    setHoveredRow(null);
};

onMouseEnterRow 함수는 마우스 커서가 행에 진입할 때 트리거되며, 현재 마우스오버한 행의 ID로 hoveredRow 상태를 업데이트합니다. 반대로, onMouseLeaveRow 함수는 마우스 커서가 행을 벗어날 때 트리거되며, hoveredRow 상태를 null(빈 값)으로 재설정합니다.

Popper 컴포넌트로 레이아웃 문제 해결하기

호버 기능을 구현하는 동안 Popper 컴포넌트와 관련된 몇 가지 레이아웃 문제가 발생할 수 있습니다. 다음은 일부 해결 방법입니다:

  1. Popper 컴포넌트에 disablePortal={true} 속성을 추가해보세요. 이 속성은 Popper 컴포넌트가 행 바깥쪽에 렌더링되는 것을 방지합니다.
  2. DataGrid 컴포넌트의 열 헤더, 행, 페이지네이션 컨테이너의 z-index 속성을 조정해보세요. Popper 컴포넌트 자체의 z-index도 수정하여 레이아웃 내에서의 스택 순서를 제어할 수 있습니다.
  3. 위의 방법이 원하는 결과를 제공하지 않는 경우, DataGrid에 몇 개의 새 열을 추가하는 것도 고려해보세요. 이렇게 하면 Popper 컴포넌트의 위치 조정에 도움이 될 수 있습니다.

결론

이 블로그 포스트에서는 MUI v5의 DataGrid나 DataGridPro 컴포넌트에 마우스오버한 행에 사용자 정의 편집 및 삭제 컴포넌트를 추가하는 방법을 살펴보았습니다. componentsProps 속성을 활용하고 적절한 이벤트 핸들러를 구현함으로써 원하는 기능을 달성할 수 있었습니다. 또한, Popper 컴포넌트와 관련된 레이아웃 문제를 해결하는 몇 가지 해결 방법에 대해서도 논의했습니다. 이러한 지식을 활용하여, MUI v5로 개발된 React 앱의 행 상호작용을 사용자 정의함으로써 사용자 경험을 향상시킬 수 있습니다.

참고 자료 :

https://stackoverflow.com/questions/70951533/custom-edit-and-delete-components-on-row-datagrid-mui-v5-component-hovered

같은 카테고리의 다른 글 보기 :

reactjs

Leave a Comment