コース一覧
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分

イベントオブジェクト

イベントから値を取り出す道すじ

ハンドラは情報を受け取れる

イベントハンドラは、呼ばれるときに引数を 1 つ受け取ります。何が起きたのかをまとめた イベントオブジェクト です。慣習として e または event という名前を付けます。

JavaScript (JSX)

function handleClick(e) { console.log(e.type); // "click" console.log(e.target); // 実際に押された要素 }

渡すのは自分ではありません。onClick={handleClick} と関数を渡しておけば、React が押されたときに e を入れて呼んでくれます。

e.target は「押された当人」

一番よく使うのが e.target です。イベントが起きた要素そのものを指します。要素なので、そこから属性も中身も読めます。

JavaScript (JSX)

function handleClick(e) { console.log(e.target.textContent); // ボタンの文字 console.log(e.target.dataset.id); // data-id の値 }

data- で始まる属性は、HTML が自由に付けてよい印です。JSX でもそのまま data-id="1" と書けて、JavaScript 側では e.target.dataset.id で取り出せます。「どのボタンが押されたか」を区別したいときの定番です。

3 つのボタンに 1 つのハンドラ

ボタンごとに別々の関数を用意すると、ボタンが増えるたびに関数も増えます。data 属性とイベントオブジェクトを使えば、ハンドラは 1 つで足ります。

JavaScript (JSX)

function handleSelect(e) { setSelected(e.target.dataset.title); } <button data-title="レシピ検索アプリ" onClick={handleSelect}>レシピ検索アプリ</button> <button data-title="買い物メモツール" onClick={handleSelect}>買い物メモツール</button>

どちらを押しても同じ関数が呼ばれますが、e.target が違うので結果が変わります。

target と currentTarget

似たものに e.currentTarget があります。target が「実際に押された一番内側の要素」なのに対し、currentTarget は「ハンドラを付けた要素」です。ボタンの中に span を入れて span を押すと、target は span、currentTarget はボタンになります。data 属性をボタンに付けているのに値が取れないときは、たいていこれが原因です。中に要素を入れるなら currentTarget を使ってください。

演習

作品名のボタンを押すと、選択中の作品名が変わるようにします。

ヒント

data-title="レシピ検索アプリ" は e.target.dataset.title で取り出せます

ボタンごとに関数を分ける必要はありません。同じ handleSelect を3つとも渡します

App.jsx
プレビュー

できているか

  • 選択中の行が画面に出ている
  • 1つめのボタンを押すと「レシピ検索アプリ」が選択中になる
  • 2つめのボタンを押すと「買い物メモツール」に変わる
  • 3つめのボタンを押すと「写真ギャラリー」に変わる
エディタを読み込んでいます