propsとchildrenは何が違うのか

ReactでTypeScriptを書いていると、必ず出会う2つの言葉。propschildren

「どっちも同じようなものでしょ?」

違います。この2つを混同すると、コンポーネント設計で確実に詰まります。

この記事では、実際のコードを見ながら、2つの本質的な違いを解説します。読み終わる頃には、どちらを使うべきか瞬時に判断できるようになります。

まず、propsとは何か

propsは「properties」の略。コンポーネントに渡すデータです。

type Props = {
  name: string;
  age: number;
};

この型定義は「nameという文字列と、ageという数値を受け取る」という意味です。

コンポーネントの中身

const MyComponent: React.FC<Props> = ({ name, age }) => {
  return (
    <h1>
      {name}さん({age}才)
    </h1>
  );
};

nameageを受け取って、画面に表示します。シンプルです。

呼び出し方

<MyComponent name="田中" age={25} />

結果: 「田中さん(25才)」と表示されます。

ここまでは理解できるはずです。問題はここからです。

childrenは何が違うのか

childrenも、実はpropsの一種です。しかし、特別な性質を持っています。

type Props = {
  title: string;
  children: React.ReactNode;
};

childrenは型がReact.ReactNodeです。この型は「何でも入る」という意味です。

コンポーネントの中身

const MyComponent: React.FC<Props> = ({ title, children }) => {
  return (
    <>
      <h1>{title}</h1>
      {children}
    </>
  );
};

titleを見出しにして、その下にchildrenを表示します。

ここで重要なのは、コンポーネント側はchildrenの中身を知らないという点です。

呼び出し方が全く違う

<MyComponent title="お知らせ">
  <p>本日は晴れです。</p>
  <p>気温は25度です。</p>
</MyComponent>

注目してください。childrenという名前は、どこにも書いていません。

タグの間に書いた内容が、自動的にchildrenとして渡されます。

結果:

お知らせ本日は晴れです。気温は25度です。

2つの決定的な違い

違い1: 渡し方

props:

<Component name="田中" age={25} />

名前を明示して渡します。

children:

<Component>
  ここに書いた内容が自動的にchildrenになる
</Component>

タグの間に書けば、自動的に渡されます。

違い2: 型の明確さ

props:

type Props = {
  name: string;  // 文字列のみ
  age: number;   // 数値のみ
};

型が厳密に決まっています。

children:

children: React.ReactNode;  // 何でもOK

テキスト、HTMLタグ、コンポーネント、配列、すべて入ります。

違い3: 用途

props: コンポーネントの「設定値」を渡す

  • 例: 名前、色、サイズ、表示/非表示フラグ

children: コンポーネントの「中身」を渡す

  • 例: カード内に表示する内容、モーダルの本文、リストの項目

実践: どちらを使うべきか

ケース1: ユーザー情報を表示

// propsを使う
<UserProfile name="田中" age={25} job="エンジニア" />

理由: 渡すデータが明確で、型も決まっているから。

ケース2: カードコンポーネント

// childrenを使う
<Card title="プロフィール">
  <p>名前: 田中</p>
  <p>年齢: 25才</p>
  <Image src="photo.jpg" />
</Card>

理由: カードの中身は毎回変わるから。外側の枠だけを提供し、中身は呼び出し側が決める。

ケース3: 両方使う

<Section title="ニュース" bgColor="blue">
  <Article>記事1</Article>
  <Article>記事2</Article>
</Section>
  • titlebgColorはprops(設定値)
  • <Article>タグはchildren(中身)

この使い分けが、Reactコンポーネント設計の核心です。

よくある誤解

誤解1: 「childrenは省略できる」

できません。children: React.ReactNodeを型定義したら、必ず何か渡す必要があります。

省略可能にするには:

children?: React.ReactNode;

誤解2: 「childrenは1つだけ」

違います。複数渡せます。

<Component>
  <div>要素1</div>
  <div>要素2</div>
  <div>要素3</div>
</Component>

すべてがchildrenとして扱われます。

誤解3: 「propsの方が優れている」

用途次第です。childrenがないと、再利用可能なコンポーネントは作れません。

実務での使い分けルール

propsを使う場合

  • データが明確に決まっている
  • 型で制限したい
  • 設定値を渡す

childrenを使う場合

  • 中身が毎回変わる
  • 柔軟性が必要
  • レイアウトや枠だけを提供する

両方使う場合

  • 設定値と中身の両方が必要
  • 実務では最も多いパターン

まとめ

propsとchildrenの違いは、次の一文に集約されます。

propsは「名前をつけて渡す設定値」、childrenは「タグの間に書く中身」。

この違いを理解すれば、Reactのコンポーネント設計で迷うことはなくなります。

次にコンポーネントを作る時、「これはpropsか? childrenか?」と自問してください。その判断が、コードの品質を決めます。


参考資料