コース一覧
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 や onSubmit に 関数そのもの を渡す。かっこは付けない
  • ハンドラは引数でイベントオブジェクトを受け取り、e.target.value で入力値を読む
  • 入力欄は value と onChange の 1 組で state と同期させる
  • 送信は form の onSubmit で受け、先頭で e.preventDefault() を呼ぶ
  • エラー文も state に持ち、setError で出し入れする

この 5 つを 1 つの画面にまとめると、お問い合わせフォームの React 版が完成します。

できあがりの形

画面に置くものは 3 つです。入力の並んだ form、エラー文の行、送信結果の行。state は入力欄 3 つぶんに、エラーと結果を足して 5 つになります。

JavaScript (JSX)

const [name, setName] = useState(""); const [kind, setKind] = useState("仕事のご依頼"); const [body, setBody] = useState(""); const [error, setError] = useState(""); const [sent, setSent] = useState("");

送信のハンドラは、止める、確かめる、まとめる、の順です。

JavaScript (JSX)

function handleSubmit(e) { e.preventDefault(); if (name.trim() === "" || body.trim() === "") { setError("お名前と本文を入力してください"); setSent(""); return; } setError(""); setSent("【" + kind + "】" + name + " さんから「" + body + "」を受け取りました"); }

ご用件の select はチェックの対象に入れていません。初期値としてどれかが必ず選ばれているので、空になることが無いからです。空にしたい選択肢があるなら、値が空の option を先頭に置いてチェックに加えます。

同じものを素の JavaScript で書いたときとの違い

JavaScript 入門でも同じフォームを作りました。あちらでは querySelector で要素を探し、value を読み、textContent を書きかえていました。今回はそのどれも書いていません。読むのは state、変えるのも state で、画面は React がついてくるだけです。

書く量が減るというより、画面の状態を 1 か所で言い切れる ようになったのが大きな違いです。いま何が入力されていて、エラーが出ているかどうかは、5 つの state を見れば全部わかります。

演習

お問い合わせフォームを完成させます。

ヒント

エラーのときは setSent("") で前の結果も消しておくと、成功と失敗が画面で混ざりません

送信が通ったときは setError("") を忘れないでください。エラー文は自分で消さないと残ります

App.jsx
プレビュー

できているか

  • フォームが画面にある
  • 何も入れずに送信するとエラー文が出る
  • 3つとも入力して送信すると、ご用件つきの結果が出る
  • 本文を消して送信し直すと、また未入力のエラーになる
  • お名前を空にして送信してもエラーになる
エディタを読み込んでいます