コース一覧
React道場 ハレノヒ珈琲をモダン化する10問
予約フォームを制御せよ

React道場 ハレノヒ珈琲をモダン化する10問

React の基本を終えた人が、白紙から部品を組み立てる演習専用コースです。解説はありません。依頼と完成条件だけを読み、自分で設計します。手が止まったときのために、方針・使う構文・部分解の3段階のヒントを各問に用意しています。props を受ける部品から始まり、state、条件付きのクラス、map での描画、絞り込み、制御コンポーネント、入力の検証を経て、最後は部品の分割と注文ウィジェットの完成まで、10問で React の主要な考え方を一巡します。1問15分から45分、全10問で約5時間です。React入門を終えて「写経はできるが白紙からは書けない」と感じている方に向いています。

1
初段
01. MenuCard部品を作れ15分
02. いいねボタン15分
03. ダークモード切替(React版)20分
04. メニュー一覧をmapで描画せよ20分
2
中段
01. カテゴリタブで絞り込め25分
02. 予約フォームを制御せよ25分
03. 入力エラーを表示せよ30分
04. 営業中バッジと時計30分
3
師範
01. 肥大部品を分割せよ35分
02. 総合 注文ウィジェット完成45分

予約フォームを制御せよ

中段 / 目安 25分

陽葵さんがノートを広げて言います。「予約フォームもReactに引っ越し! 入力した内容をReactがちゃんと把握してる状態にしてね」。

素の JavaScript のときは、入力欄の中身を知りたくなったら input.value を読みに行っていました。文字は入力欄そのものが覚えていて、こちらから取りに行く形です。React ではこれをひっくり返します。文字を覚えるのは state で、入力欄はその state を映しているだけにするのです。この形を制御コンポーネントと呼びます。

やることは2つだけです。1つめは value={name} を書いて、入力欄に映すものを state から与えること。2つめは onChange で、打たれた文字を state に書き戻すことです。

JavaScript (JSX)

<input value={name} onChange={(e) => setName(e.target.value)} />

e.target.value の e.target は「今まさに打たれた入力欄」で、その value が打ち込まれた新しい文字です。それを更新関数に渡すと state が変わり、React が部品を呼び直し、value={name} を通して同じ文字が入力欄に返ってきます。文字が一周して戻ってくるので、画面上は普通に打てているように見えます。

ここでよくつまずくのが、value だけ書いて onChange を書かない形です。state は変わらないので、何を打っても入力欄は初期値のまま固まります。「打っても文字が出ない」ときは、書き戻しの側が欠けていると思ってください。逆に onChange だけを書くと、state は動くのに入力欄が state に従わなくなり、片想いのままです。この2つは必ず対で書きます。

人数のような選択式も同じです。select に value と onChange を付ければ、選ばれた値が state に入ります。ただし select から返る値は必ず文字列なので、数として扱いたいときは Number(e.target.value) のように変換してください。今回は表示に混ぜるだけなので、そのままでも構いません。

state に入っていることの何が嬉しいかというと、入力の途中経過を画面のどこにでも出せることです。今回は入力しながらリアルタイムに変わる確認行を出してもらいます。値を取りに行く必要がないので、{name} と書けばそこに出ます。

完成条件

  • 名前を useState で持ち、id が name の入力欄を value と onChange で制御する
  • 人数を useState で持ち、id が guests の select を value と onChange で制御する
  • className が preview の行に、いま入力されている名前と人数を出す。「陽葵 さま / 2名」のように、名前と人数の両方が読み取れる形にする
  • 入力欄に打った内容が、その場で確認行に反映される

進め方

まず名前だけを制御して、確認行に名前が出るところまで作ってください。それが動いたら人数を同じ形で足します。1つずつ動かすほうが、どちらが壊れているか分かりやすいです。

初期コードの入力欄には value も onChange も付いていません。今は React が中身をまったく知らない状態です。ここに両方を足していきます。

ヒントは3段階で、①方針、②使う構文、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。

ヒント

前のヒントを開くと次が開きます。開かずに解けると未開封クリアです

①方針 入力欄が文字を覚えるのをやめさせ、覚える役を state に移します。入力欄には state を映し、打たれた文字は state に書き戻す。この行き帰りの2本を作るのが今回の全部です。

ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
App.jsx
styles.css
プレビュー

できているか

  • 名前を打つと確認行にその名前が出る
  • 人数を3名に変えると確認行の人数も変わる
  • 名前を打ち直すと確認行も打ち直した名前になる
エディタを読み込んでいます