개발자

리액트 이벤트 위임에 대해 궁금합니다.

2023년 04월 12일조회 334

리액트 이벤트 위임에 대해 찾아 봤는데 리액트 내부적으로 이벤트를 관리해서 이벤트를 위임하든 각 태그에 이벤트를 걸든 결국 메모리나 성능상 이점이 없다고 하는데, 이게 왜 성능상 차이가 없는지 이해가 잘 안갑니다.

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 2

김주호님의 프로필 사진

https://bityoungjae.medium.com/react%EC%9D%98-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%9C%84%EC%9E%84-b08f84e16250 찾아보니 아마 이 글을 보신것 같습니다. 저 글의 요지는, 리액트가 이미 자체적으로 이벤트 위임을 처리하고 있기 때문에, 사용자 코드에서 위임하는 패턴의 코드를 작성해도 이득을 볼 수 없다 라고 보이고요, 저도 사실로 알고 있습니다. 리액트는 root element에서 모든 이벤트를 받고(v17 주요 변경사항) 내부적으로 등록된(onChange 등) 리스너를 알맞게 호출해주는 메커니즘을 가지고 있는데요, 그래서 실제로 빌드된 리액트 페이지에서는 button의 onclick에 등록해놓은 리스너 등이 웹브라우저 디버거에서는 보이지 않습니다. DOMElement에 대해서 addEventListener와 같은 웹 표준 API로 리스너를 등록하지 않았기 때문이죠. Vue, Svelte에서는 이러한 위임 처리 없이 addEventListener를 통해 리스너를 실제 DOMElement에 붙여버리기 때문에 브라우저 디버거에서 확인할 수 있고, 이벤트 capturing->bubbling에 따른 비용이 프레임워크 최적화 없이 발생한다고 보시면 됩니다.

커리어리 AI 봇님의 프로필 사진

리액트에서는 이벤트 위임을 사용하지 않고 각각의 태그에 이벤트 핸들러를 직접 걸어주는 방식을 권장합니다. 이는 리액트의 Virtual DOM 이벤트 시스템이 이벤트 위임과 유사한 동작을 수행하기 때문입니다. Virtual DOM 이벤트 시스템에서는 이벤트가 발생하면 이벤트가 발생한 컴포넌트를 찾아서 해당 컴포넌트의 이벤트 핸들러를 호출합니다. 이 때 이벤트는 상위 컴포넌트로 버블링되어 올라가면서 이벤트 핸들러가 호출되는 구조입니다. 따라서 이벤트 위임을 사용하지 않고 각각의 태그에 이벤트 핸들러를 직접 걸어주면, 이벤트 발생 시 이벤트가 발생한 태그가 렌더링된 컴포넌트가 되어 이벤트 핸들러가 호출됩니다. 이러한 방식은 Virtual DOM 이벤트 시스템에서 이벤트 위임과 유사한 동작을 수행하기 때문에 메모리나 성능상의 이점이 없다고 이야기하는 것입니다. 따라서 리액트에서는 이벤트 위임보다는 각각의 태그에 이벤트 핸들러를 직접 걸어주는 방식을 권장합니다.

커리어리 AI 봇의 답변을 평가해 주세요!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!