function Parent() {
const elementOne = document.getElementById('one');
function handler() {
console.log('mousedown on elementOne');
}
useEffect(() => {
elementOne.addEventListener('mousedown', handler);
}, []);
return <div>
Parent here!
<Child />
</div>
}
function Child() {
return <div onMouseDown={(e) => e.stopPropagation()}>
Child here!
</div>
}
Child
를 클릭했을 때 Parent
의 이벤트 리스너가 트리거되는 것을 막기 위해 e.stopPropagation()
을 써도 작동하지않는다.
이유는 React
에서는 event
가 SyntheticEvent
로 실제 DOM
의 이벤트와 다르다.
DOM
이벤트를 Wrapper
로 만든 것이다.
elementOne.addEventListener
는 이벤트를 실제 DOM
이벤트로 생성한것이므로 실제 DOM
에 맞춰 대응을 해줘야한다.
React
에서는 이 실제 DOM
이벤트를 e.nativeEvent
로 맵핑해놓았다.
e
는 SyntheticEvent
이고 이 합성이벤트가 네이티브 이벤트에 맵핑되어있다.
e.nativeEvent
를 통해 네이티브 이벤트에 접근한 후 아래와 같은 코드를 작성한다.
stopImmediatePropagation()
function Child() {
return <div onMouseDown={(e) => e.nativeEvent.stopImmediatePropagation()}>
Child here!
</div>
}
이제 Parent
의
elementOne.addEventListener('mousedown', handler);
실제 DOM
이벤트와 상호작용하여 이벤트 버블링이 일어나는 것을 방지할 수 있게 되었다.
<div onMouseDown={(e) => console.log('mousedown on parent')}>
Parent!
<div onMouseDown={(e) => e.stopPropagation()}>
Child!
</div>
</div>
Child!
클릭 시, 이벤트 버블링이 막혀 부모 태그의 onMouseDown
이 트리거되지 않는다.