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

フォーム送信

送信の既定動作を止める

送信ボタンはページを読み込み直す

form の中の送信ボタンを押すと、ブラウザは昔からの決まりに従ってページを送信し、読み込み直します。サーバーに HTML を作ってもらっていた時代の作法です。

React のアプリでこれが起きると困ります。ページが読み込み直されると、これまで貯めてきた state はすべて初期値に戻ります。入力した内容も消えます。そこで、この既定の動きを止めてから、自分で送信の処理を書きます。

onSubmit と preventDefault

JavaScript (JSX)

function handleSubmit(e) { e.preventDefault(); setSent(name + " さんから受け取りました"); } <form onSubmit={handleSubmit}> ... <button type="submit">送信する</button> </form>

e.preventDefault() は「このイベントの既定の動きをやめる」という命令です。フォーム送信ならページの読み込み直しが止まります。ハンドラの一番上に書くのが習慣です。あとに書くと、間で例外が出たときに素通りしてしまうからです。

onClick ではなく onSubmit に付ける

送信ボタンの onClick に書いても、たいていは動きます。ただし form の送信はボタン以外でも起きます。入力欄で Enter キーを押したときです。onClick だけだと Enter からの送信が素通りし、ページが読み込み直されます。

止めるべきは form の送信なので、ハンドラは form の onSubmit に付けます。ボタンのほうは type="submit" にしておくだけです。

送信時に値を読む

値を集める処理は要りません。入力欄はすでに state と同期しているので、ハンドラの中では state 変数をそのまま使えます。これが制御されたコンポーネントの利点です。

JavaScript (JSX)

function handleSubmit(e) { e.preventDefault(); setSent(name + " さんから「" + body + "」を受け取りました"); }

実際のアプリでは、ここで fetch を呼んでサーバーへ送ります。この章では送った内容を画面に出すところまでにします。

つまずきどころ

  • preventDefault を書き忘れると、押した瞬間に画面が一瞬白くなって入力が消えます
  • e.preventDefault とかっこを付け忘れても止まりません。関数は呼んではじめて効きます
  • ボタンの type を書かないと、form の中では submit として扱われます。送信させたくないボタンには type="button" を付けます

演習

送信を受け取って、内容を画面に出します。

ヒント

ハンドラは送信ボタンではなく form に付けます。入力欄で Enter を押したときも送信になるためです

入力欄は state と同期しているので、ハンドラの中では name と body をそのまま使えます

App.jsx
プレビュー

できているか

  • フォームが画面にある
  • 名前と本文を入れて送信すると、その内容が結果の行に出る
  • 名前を書きかえて送信し直すと、新しい名前に入れ替わる
  • 本文を書きかえて送信し直すと、新しい本文に入れ替わる
エディタを読み込んでいます