イベントハンドラ

クリックに反応させる

ボタンを押したときに何かをしたい。React ではその「何か」を関数にして、要素に渡します。この関数を イベントハンドラ と呼びます。操作が起きたときに呼ばれる関数、という意味です。

export default function App() { function handleClick() { console.log("押されました"); } return <button onClick={handleClick}>いいね</button>; }

onClick の値は波かっこで囲みます。中に書くのは関数そのものです。文字列ではありません。HTML の onclick="doSomething()" とは形が違うので、ここで一度書き方を切り替えてください。

渡すのは関数、呼ぶのは React

書きはじめた人がほぼ全員一度はやる間違いが、次の書き方です。

// 動きません <button onClick={handleClick()}>いいね</button>

handleClick() とかっこを付けると、その場で関数を呼んだ 結果 が onClick に入ります。結果はたいてい undefined なので、押しても何も起きません。それどころか、画面が描かれるたびに関数が走ります。中で state を更新していれば、更新が描き直しを呼び、描き直しがまた更新を呼び、止まらなくなります。

正しいのは handleClick です。かっこを付けません。呼ぶ役目は React が引き受けます。

引数を渡したいとき

かっこを付けられないなら、引数はどう渡すのか。アロー関数で包みます。

<button onClick={() => addLike(3)}>3 増やす</button>

こう書くと onClick に入るのは () => addLike(3) という関数です。押されたときにはじめて中の addLike(3) が走ります。かっこを付けたい気持ちは、この形で満たしてください。

onClick 以外も同じ規則

入力欄の onChange、フォームの onSubmit、マウスが乗ったときの onMouseEnter。どれも同じで、名前は先頭が小文字のキャメルケース、値は関数です。この章では onChange と onSubmit を続けて使っていきます。

つまずきどころ

  • onclick と全部小文字で書くと React が認識しません。onClick です
  • 引数なしなら onClick={handleClick}、引数ありなら onClick={() => handleClick(値)}
  • ハンドラの関数はコンポーネントの中に書きます。中に書くから state を触れます

演習

いいね数を操作する 3 つのボタンに、ハンドラを付けます。

ヒント

App.jsx
App.jsx
プレビュー

できているか

  • いいねボタンを1回押すと「いいね 1 件」になっている
  • もう1回押すと「いいね 2 件」になっている
  • 取り消すボタンを押すと1つ減って「いいね 1 件」に戻る
  • リセットボタンを押すと「いいね 0 件」になっている