React開発において、ユーザーの「クリック」や「入力」といったイベントを扱うことは避けて通れません。
「HTMLのイベント処理と何が違うの?」「onClick={handleClick}ってどういう意味?」と疑問に思ったことはありませんか?
本記事では、Reactのイベントハンドラの役割、基本的な使い方や注意点など、初心者でもすぐに実践できるコード例を用いて解説しています。
イベントハンドラとは何か?
Reactのイベントハンドラは、ユーザーの操作(イベント)に応じて実行される関数のことです。
例えば、「ボタンがクリックされたとき」「入力フォームの内容が変わったとき」「マウスカーソルが要素の上に乗ったとき」など、特定の出来事(イベント)が発生した際に、その後の動作(ハンドラ)を定義するために使われます。
Reactでのイベント処理は、通常のJavaScriptのイベント処理と似ていますが、いくつかの重要な違いがあります。
イベントハンドラの基本
関数名はhandleから始める
イベントハンドラはコンポーネント内で通常のJavaScript関数として定義します。
関数名は基本的にhandleから始まる名前にすることが多いです(例:handleClick、handleChange)。
属性でタグに紐づける
イベントハンドラをタグと紐づけるには、onClickなどイベントの種類に応じた特別な属性名を使います。
属性名はHTMLのイベント名に似ていますが、キャメルケースで記述します。
例えば、onClick、onChange、onSubmitなどがあります。
<開始タグ 属性={イベントハンドラ}></終了タグ>
例:onClick
<button onClick={handleClick}>
詳細はこちら
</button>関数そのものを渡す(※実行しない)
イベントハンドラを渡すときは、値にイベントハンドラの関数名のみを記載します。カッコは不要です。
- OK例(関数を渡す):
onClick={handleClick} - NG例(関数を呼び出す):
onClick={handleClick()}
()をつけてしまうと、コンポーネントがレンダリングされるたびにすぐにその関数が実行されてしまい、クリック時には何も起こらなくなってしまいます。
イベントハンドラの実例
ボタンをクリックしたときにアラートメッセージを表示する場合は以下のようにイベントハンドラを作成&セットします。
function MyButton() {
// 1. イベントハンドラ関数を定義
const handleClick = () => {
alert('ボタンがクリックされました!');
};
return (
// 2. イベントハンドラを紐付け
<button onClick={handleClick}>
クリックしてね
</button>
);
}イベントハンドラをインラインで定義する
別の関数で定義したイベントハンドラを呼び出すことが一般的ですが、属性を指定した際にインラインでイベントハンドラの関数を記述することもできます。
<button onClick={function handleClick() {
alert('クリックされました!');
}}>
アロー関数を使うと簡略化できます。
<button onClick={() => {
alert('クリックされました!');
}}>イベントハンドラの属性(Props)一覧
イベントハンドラのProps(属性)は、HTMLのイベント名に対応していますが、キャメルケース (camelCase) で記述され、関数を渡す点が特徴です。
主なイベントハンドラの属性(Props)には以下のようなものがあります。
マウスイベント
ユーザーがマウスを使って操作したときに発生するイベントです。
| Props名 | 説明 | 主な要素 |
onClick | 要素がクリックされたときに発生。 | <button>, <div>, <a> など |
onDoubleClick | 要素がダブルクリックされたときに発生。 | <button>, <div> など |
onMouseDown | マウスボタンが押されたときに発生。 | <button>, <div> など |
onMouseUp | 押されていたマウスボタンが離されたときに発生。 | <button>, <div> など |
onMouseEnter | マウスカーソルが要素の内側に入ったときに発生。 | <div>, <img> など |
onMouseLeave | マウスカーソルが要素の外側に出たときに発生。 | <div>, <img> など |
onMouseMove | マウスカーソルが要素内で移動しているときに継続的に発生。 | <div> など |
フォームイベント
ユーザーがフォーム要素(入力フィールド、ボタンなど)を操作したときに発生するイベントです。特に重要で頻繁に使われます。
| Props名 | 説明 | 主な要素 |
onChange | <input>, <textarea>, <select> の値が変更されたときに発生。 | <input>, <select>, <textarea> |
onInput | <input> または <textarea> の内容が変更されたときに発生 (onChangeと類似)。 | <input>, <textarea> |
onSubmit | <form> の送信ボタンが押されたときやEnterキーで送信されたときに発生。 | <form> |
onFocus | 要素にフォーカスが当たったときに発生(クリックやTabキーなどで選択されたとき)。 | <input>, <button> など |
onBlur | 要素からフォーカスが外れたときに発生。 | <input>, <button> など |
onReset | <form> がリセットされたときに発生。 | <form> |
キーボードイベント
ユーザーがキーボードを操作したときに発生するイベントです。
| Props名 | 説明 | 主な要素 |
onKeyDown | キーが押されたときに発生。 | <input>, <div> など |
onKeyUp | 押されていたキーが離されたときに発生。 | <input>, <div> など |
onKeyPress | (非推奨) 文字が入力されたときに発生。onKeyDownとonKeyUpの使用が推奨されます。 |
その他のイベント(クリップボード、画像、メディアなど)
| Props名 | 説明 |
onCopy | 要素の内容がクリップボードにコピーされたときに発生。 |
onPaste | 要素に内容が貼り付けられたときに発生。 |
onLoad | 画像やメディアなどのリソースの読み込みが完了したときに発生。 |
onError | 画像やメディアなどのリソースの読み込みでエラーが発生したときに発生。 |
onScroll | 要素がスクロールされたときに継続的に発生。 |
Captureイベント
上記のProps名の後に Capture をつけたバージョン(例:onClickCapture、onFocusCapture)もあります。
通常、イベントは子要素から親要素へ伝播(バブリング)しますが、Captureが付いたイベントハンドラは、イベントが要素に到達する前(キャプチャフェーズ)に実行されます。特定のシナリオでイベント伝播を制御したい場合に利用されます。
イベントオブジェクトが利用できる
すべてのイベントハンドラは、引数としてイベントオブジェクトを受け取ることができます。
慣習的にeventやeという変数名を使います。
- イベント情報の取得
- イベントが発生した要素の情報などを取得できます。
- 例: フォーム入力要素の現在の値を取得 (
event.target.value)
- デフォルト動作の阻止
- ブラウザがデフォルトで行う動作を止めたいときに使います。
- 例: フォーム送信時にページがリロードされるのを防ぐ (
event.preventDefault())
- イベント伝播の停止
- イベントが親要素に伝わるのを止めたいときに使います。
- 例:
event.stopPropagation()
イベントオブジェクトを使ったイベントハンドラの実例
例えば、フォームの送信時にページのリロードを防ぐ処理をしたい場合はイベントオブジェクトを使います。
function MyForm() {
const handleSubmit = (e) => {
// フォーム送信のデフォルト動作(ページリロード)を停止
e.preventDefault();
console.log('フォームが送信されました(リロードはなし)');
};
return (
<form onSubmit={handleSubmit}>
<input type="text" />
<button type="submit">送信</button>
</form>
);
}イベントハンドラに引数を渡す方法
イベントハンドラにイベントオブジェクト以外の独自の引数を渡すには、アロー関数(無名関数)を使って呼び出す関数をラップします。
これを、タグにイベントハンドラを紐づける際に記述します。
<開始タグ 属性={(e) => イベントハンドラ(引数, e)}></終了タグ>実例:無名関数で独自の引数を渡す
function ItemList() {
const items = [
{ id: 1, name: 'リンゴ' },
{ id: 2, name: 'バナナ' }
];
const handleItemClick = (itemId, event) => {
console.log(`${itemId}番のアイテムがクリックされました。`);
// event.targetなどで要素の情報も利用可能
};
return (
<ul>
{items.map(item => (
<li key={item.id}>
{/* クリック時にhandleClick(item.id)を実行する関数を渡す */}
<button onClick={(e) => handleItemClick(item.id, e)}>
{item.name}
</button>
</li>
))}
</ul>
);
}

