chanwu.dev

리액트 React Event Object와 합성 이벤트

React 이벤트 객체

React에서 이벤트 핸들러는 매개변수로 '합성 이벤트 객체(synthetic event)'인 'React 이벤트 객체'를 받는다.

function App() {
  function handleClick(e: React.MouseEvent) {
    // ...
  }

  return <button onClick={handleClick}>children</button>;
}
  • 왜? : React는 크로스 브라우징 이슈를 해결하기 위해 자체적으로 React 이벤트 객체를 만들었다. 덕분에 일관된 API를 사용해 모든 브라우저에서 동작할 수 있는 코드를 작성할 수 있다.
  • 한계점 : React 이벤트 객체가 모든 브라우저의 이벤트 프로퍼티나 메서드를 제공하지 않기 때문에, 필요하다면 React 이벤트 객체의 nativeEvent를 사용하여 브라우저의 기본 이벤트 객체를 참조할 수 있다.

React 이벤트 객체의 타입 최상단 BaseSyntheticEvent에서 nativeEvent를 볼 수 있다.

interface BaseSyntheticEvent<E = object, C = any, T = any> {
        nativeEvent: E;
        currentTarget: C;
        target: T
        ...
}

합성 이벤트(synthetic event)

합성 이벤트는 코드로 직접 생성하고 이벤트를 발생(dispatch)시키는 이벤트다. 사용자 클릭 같은 브라우저 자체에서 발생하는 이벤트와 다르게, 합성 이벤트는 개발자가 필요할 때 직접 생성하고 실행할 수 있다.

코드로 알아보자:

const btn = document.getElementById("btn");

// 1. 버튼을 클릭하면
btn.addEventListener("click", (e) => {
  // 2. 커스텀 이벤트 'cat'을 생성한다
  const customEvent = new CustomEvent("cat", {
    detail: {
      name: "navy",
    },
  });

  // 3. 'cat' 이벤트를 발생시킨다
  btn.dispatchEvent(customEvent);
});

// 4. 'cat' 이벤트 리스너
obj.addEventListener("cat", function (e) {
  // 이벤트 발생 시 처리할 로직
  console.log(e.detail);
});
  • (1): 버튼 클릭 시 콜백 함수가 실행된다.
  • (2): CustomEvent를 생성한다. CustomEvent 생성자의 두 번째 인자 옵션은 EventInit을 상속한 CustomEventInit이며, detail 프로퍼티를 추가적으로 갖는다. detail 프로퍼티는 이벤트와 함께 전달할 추가적인 데이터를 포함할 수 있다.
  • (3): 생성된 customEvent를 dispatchEvent() 메서드를 사용해 발생시킨다.
  • (4): 'cat' 이벤트 리스너는 발생한 커스텀 이벤트를 처리한다.

이 과정을 통해 이벤트를 직접 생성하고 발생시킬 수 있게 되었다.

결론

  • React 이벤트 객체는 크로스 브라우징 이슈를 해결하고 일관된 이벤트 처리를 가능하게 한다.
  • 합성 이벤트에 대해 정리했다. 합성 이벤트를 사용하면, 직접 시맨틱한 커스텀 이벤트를 생성하고 원하는 시점에 발생시킬 수 있다.

참고

댓글