Material-UI에서 중첩된 컴포넌트의 클릭 이벤트 전파를 어떻게 멈추는지

제목: Material-UI 중첩된 컴포넌트에서 클릭 이벤트 전파 막는 방법 Material-UI와 같은 프레임워크에서 중첩된 컴포넌트에서의 클릭 이벤트 처리는 때로는 까다로울 수 있습니다. 이 튜토리얼에서는 Material-UI와 다양한 이벤트 처리 기술을 사용하여 중첩된 컴포넌트에서 클릭 이벤트 전파를 막는 …

title_thumbnail(Material-UI에서 중첩된 컴포넌트의 클릭 이벤트 전파를 어떻게 멈추는지)

제목: Material-UI 중첩된 컴포넌트에서 클릭 이벤트 전파 막는 방법

Material-UI와 같은 프레임워크에서 중첩된 컴포넌트에서의 클릭 이벤트 처리는 때로는 까다로울 수 있습니다. 이 튜토리얼에서는 Material-UI와 다양한 이벤트 처리 기술을 사용하여 중첩된 컴포넌트에서 클릭 이벤트 전파를 막는 방법을 살펴보겠습니다.

도전과제: Material-UI에서의 중첩된 컴포넌트

Paper 컴포넌트 내부에 IconMenu 컴포넌트가 있는 시나리오를 살펴보겠습니다. 목표는 내부 컴포넌트인 IconMenu의 클릭 이벤트가 외부 컴포넌트인 Paper로 전파되는 것을 막는 것입니다.

render() {
  return (
    <Paper onClick={this._onClick}>
      <IconMenu iconButtonElement={iconButtonElement} onClick={this._iconMenuClick}>
        {menuItems}
      </IconMenu>
    </Paper>
  );
}

_iconMenuClick(event) {
  MenuItem.onClick(event);
  event.stopPropagation();
}

위의 코드에서 보이듯이, 우리는 PaperIconMenu 컴포넌트 모두에서 onClick 이벤트 핸들러를 사용하고 있습니다. 하지만 _iconMenuClick 메소드는 호출되지 않으며, 이벤트 전파가 막히지 않습니다.

해결책 1: event.stopPropagation() 활용

가장 일반적인 방법은 _iconMenuClick 메소드 내부에서 event.stopPropagation()을 사용하는 것입니다. 하지만 메소드가 onChange 이벤트 핸들러가 아닌 onClick 이벤트 핸들러 내부에서 호출되는지 확인하는 것이 중요합니다.

_iconMenuClick(event) {
  MenuItem.onClick(event);
  event.stopPropagation();
}

event.stopPropagation()을 포함함으로써 클릭 이벤트가 외부 컴포넌트로 전파되는 것을 막을 수 있습니다.

해결책 2: 최상위 노드 이벤트 전파 막기

event.stopPropagation() 외에도 event.preventDefault()을 사용하여 이벤트와 관련된 기본 동작을 막을 수 있습니다.

event.stopPropagation();
event.preventDefault();

event.stopPropagation()event.preventDefault()을 결합하여 중첩된 컴포넌트에서 클릭 이벤트의 전파를 효과적으로 막을 수 있습니다.

해결책 3: 조건문으로 우회 방법

위의 해결책이 작동하지 않는 경우, _onClick 메소드에서 조건문을 사용하여 IconMenuPaper 요소와 구별할 수 있는 우회 방법을 적용할 수 있습니다.

render() {
  return (
    <Paper onClick={this._onClick}>
      <IconMenu iconButtonElement={iconButtonElement}>
        {menuItems}
      </IconMenu>
      ...
    </Paper>
  );
}

_onClick(event) {
  if(event.target.innerText == "") { // IconMenu 요소를 식별하기 위한 조건
    event.stopPropagation();
    return 0;
  }
  // 기본 동작 계속 진행
  ...
}

event.target의 내용을 확인하여 IconMenu 요소인지 확인하고 필요한 경우 이벤트 전파를 막을 수 있습니다.

결론

Material-UI에서 중첩된 컴포넌트를 다룰 때 클릭 이벤트 처리는 도전이 될 수 있습니다. event.stopPropagation(), event.preventDefault(), 조건문과 같은 기술을 사용하여 중첩된 컴포넌트에서 클릭 이벤트 전파를 효과적으로 막을 수 있습니다. 이러한 해결책을 적용하면 Material-UI 애플리케이션에서 원활하고 최적화된 사용자 경험을 보장할 수 있습니다.

즐거운 코딩하세요!

참고 자료 : 

reactjs

Leave a Comment