コース一覧
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 版でも! JS 版よりきっと綺麗に書けるんでしょ?」。

JS 道場でも同じものを作りました。あのときは、タブが押されるたびに一覧を空にして、条件に合うものだけを作り直して詰め込む、という手順を書きました。React ではその手順を書きません。持つのは「いま何を選んでいるか」だけ です。

state は1つで足ります。const [category, setCategory] = useState("すべて"); のように、選ばれているカテゴリ名だけを持たせてください。画面を描くときに menus を filter に掛けて、選ばれているカテゴリに合うものだけを残し、その結果を map で並べます。タブを押したときにやることは、state を書きかえることだけです。一覧をどうするかは、次に描かれるときに自然に決まります。

「すべて」の扱いだけ決めておく必要があります。filter の条件を「選ばれているのが『すべて』なら全部残す、それ以外なら category が一致するものだけ残す」と書けば、タブを1種類の仕組みで扱えます。

初期コードには categories 配列とタブのボタンがすでに並んでいて、menus の各件は category を持っています。足りないのは state と、絞り込みと、タブの onClick です。

完成条件

  • 選ばれているカテゴリを useState("すべて") で持つ
  • 最初は「すべて」が選ばれていて、全4件のカードが並ぶ
  • className="tab" のタブを押すと、そのカテゴリのカードだけが並ぶ
  • 「すべて」を押すと全件に戻る

進め方

filter は条件が真になった要素だけを集めた新しい配列を返します。元の配列は変わりません。filter してから map する、と2段でつなげて書けます。

タブのボタンには、押されたカテゴリ名を state に入れる処理を付けます。map でタブを並べているので、押されたときにどのカテゴリだったかは、その繰り返しの中の変数がそのまま使えます。

絞り込みが効かないときは、比較している値を確かめてください。データ側が持っているのはカテゴリ名の文字列で、タブが持っているのも同じ文字列です。どちらかに余計な空白や違う表記が混ざると、一致しません。

師範の言葉です。「JS 版は“消して描き直す”手続きだった。React 版は“状態が変われば絞られる”。並べて見よ」。

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

ヒント

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

①方針 一覧を作り直す手順は書きません。state に持つのは「いま何を選んでいるか」の1つだけで、並べるものは描画のたびに元の配列から絞り出します。タブが押されたら state を書きかえるだけで済みます。

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

できているか

  • はじめは「すべて」で全4件が並んでいる
  • 「ドリンク」のタブを押すとドリンク2件だけになる
  • 「フード」のタブを押すとフード2件に入れ替わる
  • 「すべて」のタブを押すと全4件に戻る
エディタを読み込んでいます