コース一覧
React設計:useEffectとコンポーネント分割
部品ツリーで考える

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分

部品ツリーで考える

画面は部品の木

画面を箱で囲むところから始める

ここまでは「必要になったら部品を作る」やり方で進めてきました。第8章では逆に、先に画面を眺めて、どこで切るかを決めてから作るやり方を練習します。

やることは単純です。出来上がりの画面を思い浮かべて、意味のまとまりごとに箱で囲みます。プロフィールサイトなら、上から順に見出しの帯、自己紹介、作品一覧、ページの足元、という4つの箱が見つかります。

箱の入れ子がそのままツリーになる

囲んだ箱は、たいてい入れ子になります。作品一覧という箱の中には、作品カードという小さい箱が3つ入っています。この入れ子を線で書き出したものが部品ツリーです。

プレーンテキスト

App ├─ Header ├─ ProfileCard ├─ WorkList │ ├─ WorkCard │ ├─ WorkCard │ └─ WorkCard └─ Footer

このツリーは、そのままファイルの構成になります。Header という箱があるなら Header.jsx を作り、App.jsx から読み込みます。設計と実装が1対1で対応するのが React の気持ちよさです。

どこで切るかの見つけ方

切れ目に迷ったら、次の3つを手がかりにします。

  • 見出しや枠線で、見た目がはっきり区切れているところ
  • 同じ形が繰り返されているところ。繰り返しは必ず部品になる
  • 「これは何を表示する箱ですか」と聞かれて、一言で答えられるところ

逆に、一言で答えられないなら箱が大きすぎます。「自己紹介と作品一覧を出す箱」と答えたくなったら、そこは2つに分かれます。

ファイルの分け方

部品を別ファイルにするときは、export default で外に出し、使う側で読み込みます。

JavaScript (JSX)

// Header.jsx export default function Header() { return ( <header> <h1>あおいのプロフィール</h1> </header> ); }

JavaScript (JSX)

// App.jsx import Header from "./Header.jsx"; export default function App() { return ( <div> <Header /> </div> ); }

./ は「同じ場所にあるファイル」という意味です。書き忘れると、React 本体のような外部のものを探しに行って見つからず、エラーになります。

つまずきどころ

最初から細かく分けすぎると、ファイルを行き来するだけで疲れます。目安は「1ファイルが画面ひとまとまりぶん」です。3行しかない部品をわざわざ切り出す必要はありません。分けるのは、繰り返しが出たときと、説明が「〜と〜」になったときで十分です。

演習

1枚に詰め込まれたプロフィールページを、ツリーどおりのファイルに分けます。実務ではツリーを決めたあと自分でファイルを作りますが、この演習では中身が空のファイルをこちらで用意してあります。どの箱をどのファイルへ移すか、という判断のほうに集中してください。

ヒント

雛形の return null を、表示したい JSX に書きかえます。export default function Header() の形はそのまま使えます

App.jsx からは import Header from "./Header.jsx" のように読み込みます

Footer は Header と同じ形で書けます。中身は footer タグと p だけで足ります

App.jsx
Footer.jsx
Header.jsx
ProfileCard.jsx
プレビュー

できているか

  • ヘッダーに「あおいのプロフィール」が表示されている
  • プロフィールの紹介文が表示されている
  • 名前の見出しが section の中に入っている
  • フッターに「あおいのプロフィールサイト」が表示されている
エディタを読み込んでいます