• システム開発に関わる内容をざっくりと書いていく

Propsとコンポーネント分割について

Propsとコンポーネント分割:Reactは部品の世界

Reactの強みのひとつは「部品化(コンポーネント化)」が自然にできること。
そしてその部品にデータを渡す仕組みが「Props(プロップス)」。

今回のテーマはこの2つ:Propsの使い方と、部品化(コンポーネント分割)の考え方


なんでコンポーネントに分けるの?

理由はシンプル:

  • 責務を分けたい
  • 再利用したい
  • 管理しやすくしたい

例えるなら、「Reactはレゴブロック」
小さな部品を組み合わせて、柔軟でメンテしやすいUIを作っていく。


Propsってなに?

Propsは「親コンポーネントから子コンポーネントに渡すデータや関数」のこと。

tsx
<TodoItem title="牛乳を買う" onDelete={handleDelete} />

この書き方で、TodoItemという部品に、title(文字列)とonDelete(関数)を渡してる。

受け取る側(TodoItem.tsx)はこう:

tsx
interface TodoItemProps {
title: string;
onDelete: () => void;
}

const TodoItem = ({ title, onDelete }: TodoItemProps) => {
return (
<div>
<span>{title}</span>
<button onClick={onDelete}>削除</button>
</div>
);
};

ポイント:

  • interfaceでpropsの型を定義(TypeScriptの恩恵)
  • {}でpropsを分割して受け取る(分かりやすく書ける)

コンポーネント分割のコツ

React初心者がよくやりがちなのが「全部App.tsxに書く」パターン。
最初はそれでもいいけど、すぐに見通しが悪くなる。

理想:1コンポーネント = 1責務

今回のTodoアプリなら、こういう分割になる:

App.tsx        → 状態管理 & 全体構成
TodoList.tsx → リスト表示担当
TodoItem.tsx → 1つのアイテムの見た目と削除ボタン

この分割をすることで:

  • 表示に関するコードロジックに関するコードが分離できる
  • 状態管理はApp.tsxに集約される(管理がラク)
  • コンポーネントごとのテストや再利用もしやすい

コールバック関数の受け渡しもProps

子コンポーネント内で「何かアクションが起きたとき」に、親に伝えるには関数を渡す

tsx
<TodoItem title="メモ" onDelete={() => onDelete(index)} />

親から子へ渡して、子がその関数を実行すると、親の状態が変わる。

このパターン、Reactで非常によく出てくる。


型安全にPropsを書く習慣をつける

TypeScriptを使っているなら、propsに型をつけよう。
読みやすく、間違いにくく、補完も効く。

tsx
interface TodoListProps {
todos: string[];
onDelete: (index: number) => void;
}

propsの数が増えても、interfaceで一括管理できるから便利。


コンポーネント分割を極めると…

  • UIの再利用性がぐっと上がる
  • 大規模開発でも管理しやすい構造になる
  • アトミックデザインStorybookとも相性が良くなる

実践したいこと

  • TodoItem, TodoList など、見た目ごとに分割してみる
  • ボタンや入力欄をさらに小さなコンポーネントにしてみる
  • Propsの受け渡しでデータとイベントをコントロールする

👇 サンプルアプリ:Todoアプリ(Propsと分割)


まとめ

  • Reactでは部品化が正義
  • Propsを使えば親→子のデータフローが簡潔に書ける
  • interfacepropsの型定義をしよう
  • 小さく分割して、責任を明確にするのがコツ