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 の上にクロスブラウザ互換・プーリング・委譲機能を加えたラッパーです。
2. よく使う 5 つのシグネチャ
3. target と currentTarget の違い
span をクリックすると e.target = span、e.currentTarget = button になります。ハンドラを付けた要素の型を確実に取得するには currentTarget を使います。
4. preventDefault — 呼ぶタイミング
5. チェックボックスは value ではなく checked を使う
6. イベント委譲 — React が自動で処理
<button onClick={...}> と書くだけで、実際にはルートコンテナに一度だけリスナーが付き、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. チェックボックスは e.target.checked を使う
4. e.currentTarget が安全
e.target はクリックされた子要素 (span など) になる場合があります。ハンドラを付けた要素の型は currentTarget から取得します。
5. e.stopPropagation() は React ツリー内のみ有効
外部ライブラリ (jQuery など) が document にリスナーを付けていると、React の stopPropagation では止められません。その場合は e.nativeEvent.stopImmediatePropagation() を使います。
⚡ 実際に動かしてみる — イベントオブジェクトの中身を確認
console.log でイベントオブジェクトにどのような情報が含まれているか確認しましょう。
✏️ JS 코드
📟 コンソール出力
▶ 実行ボタンを押してください
⚠️ ブラウザのサンドボックスで実行 — console.log()のみ対応、alert/fetchは不可
確認クイズ
input の onChange ハンドラの最も正確な TypeScript 型は何ですか?
先に読むとよい概念: useReducer — Redux の基盤
次のおすすめ: カスタム Hooks