React/Hooks/Lesson 11
SyntheticEvent — onChange/onSubmit 타입과 preventDefault 시점
25분·theory
이 챕터
3/5
TypeScript
SyntheticEvent — onChange/onSubmit 타입과 preventDefault 시점
💡 왜 배워야 할까요? — 매일 쓰는데 타입을 어림짐작
🎯
`onChange={(e) => ...}` 의 `e` 가 무엇인지 모르고 쓰면 `e.target.value` 가 any 가 되어 자동완성·오타 검증을 모두 잃습니다.
💼
React 의 이벤트 객체는 브라우저 `Event` 의 래퍼 (`SyntheticEvent`). 추가 기능 있지만 시그니처는 거의 같음.
⚡
`onChange`, `onClick`, `onSubmit`, `onKeyDown` — 각각 타입이 다르고, 대상 요소(`HTMLInputElement` vs `HTMLButtonElement`)도 타입에 들어갑니다.
🔗
`e.preventDefault()` 호출 시점을 놓치면 폼이 새로고침되거나 링크가 이동해버립니다.
📈
이벤트 위임은 React 가 알아서 합니다 — 모든 이벤트는 사실 root 에서 한 번에 처리.
🏢 실무에서는
폼 한 줄 만들 때마다 부닥치는 일. 5가지 타입을 외워두면 평생 안 헷갈립니다. `useState`·`useEffect` 처럼 매일 쓰니까 외우는 게 빠릅니다.
React 이벤트 5가지 핵심 타입
1. SyntheticEvent — 브라우저 이벤트의 래퍼
React 이벤트는 표준 Event 위에 cross-browser 호환 + 풀링 + 위임 기능을 더한 래퍼.
2. 자주 쓰는 5가지 시그니처
3. target vs currentTarget
span 을 클릭하면 e.target = span, e.currentTarget = button. 핸들러를 단 요소의 타입을 확실히 받으려면 currentTarget.
4. preventDefault — 호출 시점
5. checkbox 는 value 가 아니라 checked
6. 이벤트 위임 — React 가 알아서
사용자가 <button onClick={...}> 라 적어도, 실제로는 root container 에 한 번만 listener 가 붙고 React 가 가상 트리를 거슬러 올라가며 핸들러 호출. 사용자는 이 디테일을 몰라도 됨.
💡 💡 React 이벤트 실전 5
1. 자주 쓰는 5가지만 외워라
- ▸input/textarea/select 의 onChange:
ChangeEvent<HTMLInputElement>등 - ▸form 의 onSubmit:
FormEvent<HTMLFormElement> - ▸button 의 onClick:
MouseEvent<HTMLButtonElement> - ▸input 의 onKeyDown:
KeyboardEvent<HTMLInputElement> - ▸focus/blur:
FocusEvent<HTMLInputElement>
2. onSubmit 의 첫 줄은 항상 e.preventDefault()
빼먹으면 폼이 GET/POST 로 페이지 전체 새로고침.
3. checkbox 는 e.target.checked
4. e.currentTarget 이 안전
e.target 은 실제 클릭된 자식 요소(span 등) 일 수 있음. 핸들러를 단 요소의 타입은 currentTarget.
5. e.stopPropagation() 은 React 트리 안에서만
외부 라이브러리(jQuery 등) 가 document 에 listener 를 달았다면 React stopPropagation 으로 못 막음. 그땐 e.nativeEvent.stopImmediatePropagation().
⚡ 직접 실행해보기 — 이벤트 객체 구조
이벤트 객체에 어떤 정보가 들어있는지 console.log 로 확인.
✏️ JS 코드
📟 콘솔 출력
▶ 실행 버튼을 눌러보세요
⚠️ 브라우저 샌드박스에서 실행 — console.log()만 지원, alert/fetch 불가
확인 퀴즈
input 의 onChange 핸들러의 가장 정확한 TS 타입은?
먼저 읽으면 좋은 개념: useReducer — Redux 의 기반
다음 추천: 커스텀 Hooks