コース一覧
Reactで状態・フォーム・リストを扱う
イベントハンドラ

Reactで状態・フォーム・リストを扱う

useState、イベントハンドラ、制御されたinput、フォーム送信とバリデーション、mapによるリスト表示、key、条件レンダリング、空状態を扱う全25レッスンのコースです。入力・絞り込み・ダークモードへ反応する作品ギャラリーを作り、ユーザー操作で変化するUIの基本を身につけます。

1
state(useState)
01. なぜstateが必要か15分
02. useState15分
03. ボタンで更新15分
04. 複数のstate15分
05. オブジェクトのstate15分
06. 配列のstate15分
07. 再レンダリングの仕組み10分
08. つくる - ダークモード切替20分
09. 第4章クイズ15分
2
イベントとフォーム
01. イベントハンドラ15分
02. イベントオブジェクト15分
03. 制御されたinput15分
04. 複数の入力15分
05. フォーム送信15分
06. バリデーション15分
07. つくる - 問い合わせフォーム20分
08. 第5章クイズ15分
3
リストと条件レンダリング
01. mapでリスト描画15分
02. key15分
03. 条件レンダリング(&&)15分
04. 出し分け(三項)15分
05. 空状態15分
06. 絞り込みUI15分
07. つくる - ギャラリーReact版20分
08. 第6章クイズ15分

イベントハンドラ

onClick に渡すのは関数そのもの

クリックに反応させる

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

JavaScript (JSX)

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

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

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

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

JavaScript (JSX)

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

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

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

引数を渡したいとき

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

JavaScript (JSX)

<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 つのボタンに、ハンドラを付けます。

ヒント

onClick={addLike} のように、関数名にかっこを付けずに渡します

onClick={addLike()} と書くと描画のたびに関数が走ってしまい、押しても反応しません

App.jsx
プレビュー

できているか

  • いいねボタンを1回押すと「いいね 1 件」になっている
  • もう1回押すと「いいね 2 件」になっている
  • 取り消すボタンを押すと1つ減って「いいね 1 件」に戻る
  • リセットボタンを押すと「いいね 0 件」になっている
エディタを読み込んでいます