コース一覧
Reactで状態・フォーム・リストを扱う
mapでリスト描画

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分

mapでリスト描画

配列をカードに変える

手で3枚並べたところを回収します

第3章の「部品の再利用」で、作品カードを手で3枚コピーして並べました。作品が1件増えたら JSX をコピーして貼り、公開をやめたら消す。データは配列で持っているのに、画面のほうだけ手作業で追いかけている状態でした。この回でそこを直します。

配列を JSX の配列に変える

React でリストを出すときは配列の map を使います。実践JavaScript で書いた map と同じもので、行き先が文字列や数値ではなく JSX になるだけです。

JavaScript (JSX)

const works = [ { id: 1, title: "レシピ検索アプリ", category: "web" }, { id: 2, title: "買い物メモツール", category: "tool" }, { id: 3, title: "写真ギャラリー", category: "web" }, ]; export default function App() { return ( <div className="work-list"> {works.map((work) => ( <div className="work-card"> <h2>{work.title}</h2> <p>{work.category}</p> </div> ))} </div> ); }

works.map(...) が返すのは JSX が3つ入った配列です。JSX の中で波かっこに配列を置くと、React は中身を順番に並べて描いてくれます。3件が30件になっても、書きかえるのは配列のほうだけです。

つまずきどころ

forEach に書きかえてしまうと何も出ません。forEach は戻り値が undefined で、JSX の配列を作ってくれないからです。並べたいときは必ず map を使います。

アロー関数の書き方も間違えやすいところです。丸かっこで包んだ (work) => (<div>...</div>) は書いた JSX がそのまま返りますが、波かっこで包んだ (work) => { <div>...</div> } は何も返りません。波かっこを使うなら return が要ります。

もう1つ、JSX の波かっこの中に書けるのは式だけです。if 文はそのままでは書けません。条件で出し分けたいときの書き方は、このあとのレッスンで扱います。

実行するとコンソールに警告が出ます

上のコードを動かすと、画面は正しく出るのに key に関する警告がコンソールに出ます。これは間違いではなく、React が「どの行がどのデータか教えてほしい」と言っている状態です。次のレッスンで消します。

演習

手で書いていた作品カードを、works 配列からの map に置きかえます。

ヒント

JSX の中に配列を出すときは {works.map((work) => (...))} のように波かっこで包みます

アロー関数の本体を丸かっこで包むと、その JSX がそのまま返ります

App.jsx
プレビュー

できているか

  • work-card が3枚並んでいる
  • カードが work-list の中に入っている
  • 2件目の「買い物メモツール」が表示されている
  • 3件目の「写真ギャラリー」が表示されている
エディタを読み込んでいます