← Angular コース
81. 賢い親と表示に徹する子 — 役割で層を分ける
コンポーネントは「ページコンポーネント」と「表示コンポーネント」の2種類に役割分担させると設計が安定します。ページコンポーネントはデータの取得と状態の保持を担当する賢い親です。表示コンポーネントは input() で受け取った値を表示し、操作を output() で通知するだけの、表示に徹する子です。
この分担の御利益は、表示部品の再利用とテストのしやすさです。サービスにも通信にも依存しない表示部品は、値を渡せばどこでも同じように動き、テストも「この値を渡したらこう表示される」を確認するだけで済みます。データ取得の都合が変わっても、修正はページ側だけで完結します。
初学者の落とし穴は、子コンポーネントの中で inject() してサービスを直接触りたくなることです。一見手軽ですが、その部品はサービスに縛られて他の画面で使い回せなくなります。迷ったら「子は Input と Output だけ」を守り、通信や状態は親に寄せましょう。
サンプルコード(フレームワーク環境が必要なため表示のみ)
// ── 役割分担のイメージ ──
//
// ProductListPage(ページコンポーネント = 賢い親)
// ・サービスを inject() してデータを取得する
// ・画面の状態(選択中の商品など)を signal で持つ
// ・子から届いた Output を受けて次の処理を決める
// │ [product]="..." (addToCart)="..."
// ▼ ▲
// ProductCard(表示コンポーネント = 表示に徹する子)
// ・input() で受け取った商品を表示するだけ
// ・ボタンが押されたら output() で親に知らせるだけ
// ・サービスも通信も知らない → どの画面でも使い回せる
サンプルコードで身につける(5本) →
学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。
公式ドキュメントで詳しく ↗