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

バリデーション

送る前に条件で分ける

入力の確認も state の仕事

名前が空のまま送信されたら、送らずに「入力してください」と伝えたい。この入力チェックを バリデーション と呼びます。

JavaScript 入門では、エラー文の p 要素を textContent で書きかえていました。React ではその書きかえをしません。画面は state から作るので、エラー文も state に持ちます。state が変われば画面がついてきます。

JavaScript (JSX)

const [error, setError] = useState("");

送信のハンドラで分岐する

JavaScript (JSX)

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

見どころが 2 つあります。

1 つめは return です。エラーを立てたらそこで関数を終わらせます。書き忘れると、エラーを出したうえで送信も続きます。

2 つめは、通ったときに setError("") でエラーを消していることです。一度出したエラー文は、消す処理を書かないかぎり残り続けます。state は自分で片付けないと元に戻りません。

エラー文を画面に出す

JavaScript (JSX)

<p id="error">{error}</p>

error が空文字のあいだは中身の無い p が置かれるだけで、何も見えません。値が入ったときだけ文字が現れます。もっと丁寧にやるなら、赤字にしたり、エラーのときだけ要素ごと出したりします。条件で要素を出し分ける書き方は第 6 章で扱います。

空白だけの入力

name === "" だけだと、スペースを 1 つ打っただけで通ってしまいます。前後の空白を落としてから比べると防げます。

JavaScript (JSX)

if (name.trim() === "") { ... }

つまずきどころ

  • チェックは preventDefault() のあとに書きます。順番が逆だと、エラーでも送信が走ります
  • 送信が通ったときにエラーを消し忘れると、成功してもエラー文が残ります
  • required 属性だけに頼らないでください。ブラウザごとに見た目が違い、思ったところで止まりません

演習

未入力のまま送信されたら、エラー文を出すようにします。

ヒント

if の中で setError を呼んだら return で関数を終わらせます。書かないと送信まで進みます

一度出したエラー文は自動では消えません。成功したときに空文字を入れ直します

App.jsx
プレビュー

できているか

  • 何も入れずに送信するとエラー文が出る
  • 名前だけ入れて送信しても、本文が空ならエラーのままになる
  • 両方そろえて送信すると結果が出る
  • 本文を消して送信し直すと、また未入力のエラーになる
エディタを読み込んでいます