HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
♥️
2기 최종 프로젝트 팀별 공간
/
💡
[팀 04] 동규라미
/
🎵
보드
/
🧴
이벤트 전파 - feat. Dropdown
🧴

이벤트 전파 - feat. Dropdown

상태
완료
태그
ISSUE
날짜
Nov 27, 2022
사람
이슈코드에서 원인 발견하기해결 방법결론참고

이슈

Dropdown 컴포넌트 내부의 아이콘을 클릭하면 토글 이벤트가 작동하지 않는 이슈
정확히는 토글이 발생하지 않는 것이 아니라 Toggle 이 발생하고 ClickOutSide 이벤트가 발생해 바로 닫혀버리는 것이다

코드에서 원인 발견하기

const handleClickToggle = () => { if (disabled) return; setIsOpen((prev) => !prev); };
const handleClickOutSide = React.useCallback( (e: MouseEvent) => { if (isOpen && !ref.current?.contains(e.target as HTMLElement)) { setIsOpen(false); } }, [isOpen], ); React.useEffect(() => { document.addEventListener('click', handleClickOutSide); return () => { document.removeEventListener('click', handleClickOutSide); }; }, [handleClickOutSide]);
Toggle 핸들러가 먼저 실행되고 ClickOutSide 핸들러가 실행된다
이벤트 타깃은 두 군데 모두 콘솔을 통해 확인이 가능했지만 한 가지 다른 점이 있다
ref.current?.contains(e.target as HTMLElement)
ref에서 이벤트 타깃을 ClickOutSide 핸들러에서 찾지 못했다
그래서 이러한 이슈가 발생하게 된 것이다
이에 대한 정확한 이유를 모르겠다

해결 방법

React.useEffect(() => { document.addEventListener('click', handleClickOutSide, true); return () => { document.removeEventListener('click', handleClickOutSide, true); }; }, [handleClickOutSide]);
Toggle 핸들러에서 먼저 캡처를 하기 때문인가? 라는 의문에서 시작해서 ClickOutSide 에서 캡처링 단계에서 타깃을 발견할 수 있도록 했더니 해결되긴 하였다

결론

이벤트 캡처링, 버블링 단계의 개념을 통해 해결은 되었으나 올바른 방법인지 그리고 정확한 원인이 무엇인지 파악하지 못해 조금 더 알아보아야 한다

참고

Web: Event와 addEventListener 알아보기 (개념, React에서 주의할 점)
일반적으로 사용자로부터 데이터를 입력받고 할 때는 input 같은걸 쓰면 되다보니 키보드 입력을 어떻게 받는지에 대해서 생각해본 적은 없었다. 그런데 최근에 단축키 기능 같은걸 만들어야 했어서 코드를 뒤져보니 이벤트 리스너를 사용하고 있었다. 일단 이벤트란 무엇일까. 이벤트는 우리의 프로그램에서 발생하는 어떤 사건이다. 이는 주로 사용자와의...
Web: Event와 addEventListener 알아보기 (개념, React에서 주의할 점)
https://medium.com/hcleedev/web-event%EC%99%80-addeventlistener-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-%EA%B0%9C%EB%85%90-react%EC%97%90%EC%84%9C-%EC%A3%BC%EC%9D%98%ED%95%A0-%EC%A0%90-a581adc49aa4
Web: Event와 addEventListener 알아보기 (개념, React에서 주의할 점)
Web: 이벤트 버블링과 캡처링, 위임 알아보기
이상한 경우는 바로 이런 경우에 발생한다. 예를 들어 div 로 공간을 잡고, 그 속에 있는 버튼을 눌렀을 때는 버튼에 들어있는 핸들러가, div 내의 버튼 외 공간을 클릭했을 때는 div 에 붙어있는 핸들러가 동작하기를 기대하면서 코드를 짰다고 생각해보자. 이벤트 버블링은 한 요소에 이벤트가 발생하면, 이 요소에 있는 핸들러를 실행하고, 부모 요소로...
Web: 이벤트 버블링과 캡처링, 위임 알아보기
https://medium.com/hcleedev/web-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B2%84%EB%B8%94%EB%A7%81%EA%B3%BC-%EC%BA%A1%EC%B2%98%EB%A7%81-%EC%9C%84%EC%9E%84-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-f85d9c728561
Web: 이벤트 버블링과 캡처링, 위임 알아보기
Web: React의 Event 시스템 내부 구현 자세히 알아보기 (React v18.2.0)
이번주는 React의 Event 처리에 대해 한번 자세히 알아보자. 실제 React 코드를 같이 읽어가면서 설명하는 형식이라 좀 쓸데 없다고 느낄 수도 있긴 한데, React 코드 구경한다는 느낌으로 가볍게 쭉 읽어나가도 괜찮을 것 같다. JavaScript에서는 가급적이면 HTML 태그에 인라인으로 로직을 집어넣지 말고, addEventListener...
Web: React의 Event 시스템 내부 구현 자세히 알아보기 (React v18.2.0)
https://medium.com/hcleedev/web-react%EC%9D%98-event-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EB%82%B4%EB%B6%80-%EA%B5%AC%ED%98%84-%EC%9E%90%EC%84%B8%ED%9E%88-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-react-v18-2-0-39d59ab45bec
Web: React의 Event 시스템 내부 구현 자세히 알아보기 (React v18.2.0)