コース一覧
React設計:useEffectとコンポーネント分割
全セクションReact化

React設計:useEffectとコンポーネント分割

副作用、useEffect、依存配列、クリーンアップ、stateの持ち上げ、propsの受け渡し、1コンポーネント1責務、部品ツリーとフォルダ構成を扱う全19レッスンの設計コースです。JavaScript版プロフィールサイトを、状態と責務が整理されたReactアプリとして完成させます。

1
useEffectのきほん
01. 副作用とは10分
02. useEffect15分
03. 依存配列15分
04. タイトル連動15分
05. 時計とクリーンアップ15分
06. つくる - ヘッダー時計20分
07. 第7章クイズ15分
2
コンポーネント分割の設計
01. 部品ツリーで考える10分
02. stateを持ち上げる15分
03. propsのバケツリレー15分
04. 1部品1責務15分
05. フォルダ構成10分
06. つくる - ツリー整理20分
07. 第8章クイズ15分
3
総合制作
01. 全セクションReact化20分
02. メモウィジェットReact版20分
03. 命令的vs宣言的10分
04. 自由拡張20分
05. 完成と次のステップ10分

全セクションReact化

残っているのは2つだけ

ここまでの8章で、プロフィールサイトの主役はすべて React になりました。プロフィールカード、ダークモード、お問い合わせフォーム、作品ギャラリー、ヘッダーの時計です。まだ JavaScript のまま残っているのは、スキル一覧とフッターの2つだけです。この回で残りを片づけて、サイト全体を React にします。

移植の手順はいつも同じ

どのセクションでも、やることは次の4つです。ここまで無意識にやってきた流れを、言葉にしておきます。

  1. 元の HTML を見て、同じ形が繰り返されているところを探す
  2. 繰り返しの中で「変わる値」だけを取り出して配列にする
  3. 1件ぶんの見た目を返すコンポーネントを書く
  4. 配列を map でまわして並べる

スキル一覧は、まさにこの形をしています。「スキル名」と「習熟度」の2つだけが変わり、あとは同じ見た目の繰り返しです。

コードで見る

まずデータを別ファイルに置きます。表示のコードとデータが混ざっていると、スキルを1つ足すだけで見た目のコードを触ることになるからです。

JavaScript

// data.js export const skills = [ { name: "HTML", level: "得意" }, { name: "React", level: "学習中" }, ];

受け取る側は、配列を props でもらって map で並べるだけです。

JavaScript (JSX)

export default function SkillList({ skills }) { return ( <ul className="skill-list"> {skills.map((skill) => ( <li key={skill.name}> {skill.name}({skill.level}) </li> ))} </ul> ); }

スキル名は重複しないので、key にそのまま使えます。key に配列の添え字を使わない理由は第6章のとおりです。

フッターは props で受ける

フッターは繰り返しがないので map は要りません。ただし年や名前を直書きすると、あとで直す場所が増えます。呼び出す側から props で渡す形にしておきます。

JavaScript (JSX)

export default function Footer({ name, year }) { return ( <footer> <p> {year} {name} </p> </footer> ); }

つまずきどころ

別ファイルのコンポーネントを読み込むとき、パスの書き方を間違えると画面が真っ白になります。同じフォルダにあるファイルは ./SkillList.jsx のように先頭にドットとスラッシュを付けます。拡張子まで書くのが確実です。

もう1つは props の名前です。渡す側が skills なら受け取る側も skills で分割代入します。片方だけ skillList のように変えると、中身が undefined になって map のところで落ちます。

演習

まだ中身が空のままの SkillList と Footer を完成させて、サイトの全セクションを React にします。

ヒント

SkillList は props を ({ skills }) の形で分割代入して受け取ります

Footer に渡している props の名前は App.jsx を見ると分かります

footer は div ではなく footer タグで書きます。判定は footer タグの中身を見ます

App.jsx
Footer.jsx
SkillList.jsx
data.js
プレビュー

できているか

  • スキルが4件表示されている
  • li が ul の中に入っている
  • スキル一覧に習熟度も表示されている
  • footer に名前が表示されている
エディタを読み込んでいます