フォーム送信

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

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

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

onSubmit と preventDefault

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 変数をそのまま使えます。これが制御されたコンポーネントの利点です。

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

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

つまずきどころ

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

演習

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

ヒント

App.jsx
App.jsx
プレビュー

できているか

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