コース一覧
React道場 ハレノヒ珈琲をモダン化する10問
メニュー一覧をmapで描画せよ

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分

メニュー一覧をmapで描画せよ

初段 / 目安 20分

問1で作った MenuCard を並べていたら、陽葵さんがまた首をかしげます。「部品を8個並べるのも手書きなの? データを渡したら勝手に並んでほしいな〜」。

もっともな話です。メニューが増えるたびに JSX を1行ずつ足すのでは、データと見た目が2か所に分かれてしまいます。React では、配列を map で JSX の配列に変えて、それをそのまま JSX の中に置けます。

初期コードには menus という配列がすでに用意してあります。中身は { id, name, price } のオブジェクトです。この配列を menus.map(...) に掛けて、1件につき MenuCard を1つ返す形にしてください。返ってきた配列を波かっこで包んで JSX に置けば、要素の数だけカードが並びます。

ここで1つ約束事があります。繰り返しで並べた要素には key を付ける ことです。React は前回描いた並びと今回の並びを見比べて、差分だけを画面に反映します。そのとき、どれとどれが同じものかを見分ける目印が key です。付けないと警告が出ますし、並べ替えや削除が入ったときに中身が入れ替わる不具合の元になります。key に配列の添字を使うのは避けて、データが持っている id を渡してください。

key は MenuCard の props としては受け取れません。React が自分で使う特別な属性なので、<MenuCard key={m.id} ... /> と書いても MenuCard の中の props には key は入ってきません。それでいいのです。

完成条件

  • menus 配列を map で展開して MenuCard を並べる
  • 並べた要素それぞれに、データの id を key として渡す
  • カードは className="card" の要素で、h3 の商品名と className="price" の値段を持つ
  • 配列の件数ぶんカードが並ぶ

進め方

map は配列の1件ずつに関数を掛けて、返り値を集めた新しい配列を作ります。ここで返すのは JSX なので、結果は JSX の配列になります。

アロー関数で m => <MenuCard ... /> のように1つの式を返す形にすると短く書けます。波かっこで本体を包む書き方にしたときは、return を書き忘れないでください。書き忘れると何も返らないので、画面には何も出ません。

カードが1枚も出ないときは、map の結果を JSX の中に置き忘れていないか確かめてください。menus.map(...) と書いただけでは画面には出ません。波かっこで包んで JSX の中に置いて初めて描かれます。

JS 道場の問6では、同じことを createElement と appendChild を並べて書きました。並べて見比べてみてください。

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

ヒント

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

①方針 カードを手で並べるのをやめ、データの配列を JSX の配列に変換します。1件のデータから1つの MenuCard を作る関数を map に渡せば、件数ぶんの JSX がまとめて返ってきます。

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

できているか

  • 配列の件数ぶん、カードが4枚並んでいる
  • 4枚目に配列の最後の商品名が出ている
  • 4枚目に配列の最後の値段が出ている
  • 並べたカードが menu の中に収まっている
エディタを読み込んでいます