SyntheticEvent
의 인스턴스를 전달합니다.nativeEvent
( 브라우저 기본 이벤트 )가 아닙니다.SyntheticEvent
는 자주 사용하는 stopPropagation
과 preventDefault
를 포함하여 nativeEvent
와 동일한 인터페이스를 제공합니다.nativeEvent
를 사용하려면 해당 속성도 SyntheticEvent
에 있기 때문에 SyntheticEvent.nativeEvent
이렇게 접근하여 사용할 수 있습니다.onClick
함수를 통해 이벤트 객체를 받았을 때 SyntheticEvent
의 모습크게 EventPlugin
과 EventpluginHub
존재
EventPlugin
nativeEvent
와 대응하는 SyntheticEvent
를 생성하고 이와 관련된 모든 dispatch
를 수집하여 배열 형태(큐)로 반환합니다.
해당 dispatch
를 실행하지는 않습니다. ( 특정 플러그인 제외 )
관련된 모든 dispatch
를 수집하기 위해 리액트는 아래와 같이 capture and bubbling phase
를 참조하면서 컴포넌트(DOM) 트리를 이중 순회하며 순서대로 큐에 넣습니다.
stopPropagation
( 버블링 방지 )과 같은 인터럽션은 동일한 SyntheticEvent
에 속한 함수의 실행만 방지합니다.
같은 큐에 속한 dispatch
의 실행만 방지
Event Plugin Hub
EventPlugin
들은 웹이 실행되면 Event Plugin Hub
에 주입되며 configuration file
에 따라 플러그인이 정렬됩니다.nativeEvent
를 받을 때마다 다음 과정을 수행합니다.SyntheticEvent
와 관련된 dispatch
를 수집하고 그들을 큐에 저장합니다.dispatch
를 실행 후 큐에서 삭제합니다.SyntheticEvent
에서 제공하는 stopPropagation
은 오직 동일한 SyntheticEvent
(큐)에 속한 dispatch
실행만 방지합니다.stopPropagation
이 동작하지 않을 수 있습니다.stopPropagation
를 통해 버블링을 방지하고 있지만 Event A와 Event B 중 한가지는 버블링 현상에 의해 이벤트가 발생할 것입니다.SyntheticEvent
(큐)에 포함되어 있기 때문입니다.SyntheticEvent
에서 제공하는 stopPropagation
으로 버블링을 해결할 수 없다면 nativeEvent
를 활용해서 플러그인의 종류와 관계없이 stopPropagation
를 활용할 때 사용하면 좋을 것 같습니다!import React, { useTransition, useState, useId } from "react";
import "./App.css";
function App() {
const event = new Event("build");
document.dispatchEvent(event);
return (
<>
<div
customEvent_A={(evt) => console.log("event A")}
customEvent_B={(evt) => console.log("event B")}
>
<div customEvent={(evt) => evt.stopPropagation()}>클릭</div>
</div>
</>
);
}
export default App;