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;