← PC・IT用語集へ戻る

Props(プロップス)

Props
Reactなどのコンポーネント開発で、親コンポーネントから子コンポーネントへ情報を渡す仕組み。
Props(プロップス) (Props)

概要(サマリー)

Props(プロップス)は、Reactなどのコンポーネント開発で、親コンポーネントから子コンポーネントへ情報を渡すための仕組みである。

たとえば、同じ「ボタン」コンポーネントを使いながら、ある場所では「保存」、別の場所では「削除」と表示したい場合がある。このとき、親コンポーネントから子コンポーネントへ label のような値を渡すことで、同じ部品を用途に合わせて変化させられる。

Propsは、JavaScript引数に近い役割を持つ。コンポーネントを呼び出す側が値を渡し、呼び出される側がその値を読んで表示や処理に使う。

詳細解説

Propsとは何か

コンポーネントは、画面を小さな部品に分けて作る考え方である。

たとえば、プロフィールカード、ボタン、見出し、商品カードなどをコンポーネントとして作っておくと、同じ部品を複数の場所で再利用できる。

しかし、再利用できる部品でも、表示する内容は場所によって変わる。プロフィールカードなら名前や画像、ボタンなら文言や色、商品カードなら商品名や価格が変わる。

Propsは、このような「外から変えたい情報」をコンポーネントに渡すために使う。

Reactでは、親コンポーネントが子コンポーネントを呼び出すときに、HTMLの属性のような形でpropsを渡す。

基本的なコード例

次の例では、App から WelcomeMessagename というpropsを渡している。

Reactの例

function WelcomeMessage({ name }) {
  return <h1>こんにちは、{name}さん</h1>;
}

function App() {
  return (
    <div>
      <WelcomeMessage name="太郎" />
      <WelcomeMessage name="花子" />
    </div>
  );
}

このコードでは、WelcomeMessage という同じコンポーネントを2回使っている。しかし、渡している name が違うため、画面には「こんにちは、太郎さん」と「こんにちは、花子さん」が表示される。

このように、Propsを使うと、同じコンポーネントを使い回しながら、表示内容だけを変えられる。

propsは読み取り専用

Propsの重要な特徴は、受け取った側の子コンポーネントで直接書き換えないことである。

親から渡されたpropsは、子コンポーネントにとって「外から与えられた情報」である。子コンポーネントが勝手に書き換えると、どこでデータが変わったのか分かりにくくなり、バグの原因になる。

たとえば、子コンポーネントの中で props.name = "別の名前" のように変更する設計は避ける。

もし子コンポーネントから何かを変更したい場合は、親コンポーネントが変更用の関数を用意し、その関数をpropsとして子に渡す。子はその関数を呼び出すことで、親に「変更してほしい」と伝える。

PropsとStateの違い

Reactでは、PropsとStateがよく比較される。

Propsは、親コンポーネントから渡される情報である。子コンポーネントはそれを読んで表示や処理に使うが、自分で直接変更しない。

Stateは、コンポーネント自身が内部で持つ状態である。ボタンを押した回数、入力欄の値、モーダルが開いているかどうかなど、ユーザー操作や処理の結果で変化する値に使われる。

簡単に言えば、Propsは「外から渡される設定」、Stateは「自分の中で変わる状態」である。

オブジェクトや関数も渡せる

Propsで渡せるのは文字列だけではない。数値、真偽値、配列オブジェクト、関数、JSX要素なども渡せる。

たとえば、ボタンが押されたときの処理を関数として渡すことができる。

関数をpropsとして渡す例

function ActionButton({ label, onAction }) {
  return <button onClick={onAction}>{label}</button>;
}

function App() {
  function saveData() {
    alert('保存しました');
  }

  return <ActionButton label="保存" onAction={saveData} />;
}

この例では、ActionButton は「何を実行するボタンなのか」を自分では決めていない。親から渡された labelonAction によって、表示文言と処理内容が決まる。

Props Drillingに注意する

Propsは便利だが、コンポーネント階層が深くなると、親から子、さらに孫、さらにその下へと同じpropsを渡し続けることがある。

この状態は、Props Drilling(プロップスドリリング)と呼ばれる。日本語では「propsのバケツリレー」と説明されることもある。

Props Drillingが増えると、中間のコンポーネントが実際には使わないpropsを受け取って、ただ下に渡すだけになる。その結果、コードの見通しが悪くなり、変更にも弱くなる。

小さなアプリでは問題にならないことも多いが、階層が深くなった場合は、React Context、状態管理ライブラリ、コンポーネント分割の見直しなどを検討する。

AIコーディングとの関係

AIコーディングでは、Propsはコンポーネント設計を依頼するときに重要になる。

たとえば、「商品カードを作って」とだけ依頼すると、AIは表示内容をコンポーネント内に直接書いてしまうことがある。再利用しやすくしたい場合は、どの情報をpropsとして受け取るのかを明示するとよい。

AIに依頼するときは、次のように伝えると扱いやすい。

Reactで商品カードコンポーネントを作ってください。
商品名、価格、画像URL、クリック時の処理をpropsとして受け取る設計にしてください。
表示文言をコンポーネント内に固定せず、親から渡せるようにしてください。

また、既存コードをAIに見せて「propsが多すぎないか」「Props Drillingが起きていないか」「Stateにすべき値をpropsで渡していないか」をレビューさせるのも有効である。

よくある勘違い

Propsは子コンポーネント内で書き換えてよい?

基本的に書き換えない。

Propsは親から渡された情報であり、子コンポーネントはそれを読んで使う。変更が必要な場合は、親側でStateを更新し、その結果として新しいpropsを子へ渡す流れにする。

PropsとStateは同じもの?

同じではない。

Propsは外から渡される値で、Stateはコンポーネント自身が管理する値である。どちらも画面表示に使えるが、責任の場所が違う。

たとえば、ボタンに表示する文字はpropsで渡すことが多い。一方、ボタンを何回押したかのように内部で変化する値はStateで持つことが多い。

PropsはReact専用の考え方?

propsという言葉はReactでよく使われるが、「親から子の部品へ情報を渡す」という考え方は、他のコンポーネント型のフレームワークにも存在する。

ただし、書き方や細かいルールはフレームワークごとに違う。Reactの記事を読んでいる場合は、まずReactのpropsとして理解するとよい。

Propsは少ないほどよい?

少なければ常に良いわけではない。

必要な情報を明示的にpropsとして渡すことで、コンポーネントの使い方が分かりやすくなることもある。ただし、似た値が増えすぎたり、深い階層まで渡し続けたりする場合は、設計を見直すサインになる。

まとめ

  • Propsは、親コンポーネントから子コンポーネントへ情報を渡す仕組みである。
  • 同じコンポーネントでも、propsを変えることで表示内容や動作を変えられる。
  • 子コンポーネントは、受け取ったpropsを直接書き換えない。
  • Propsは外から渡される値、Stateはコンポーネント自身が管理する値である。
  • AIにReactコンポーネントを依頼するときは、どの値をpropsにするか明示すると再利用しやすいコードになりやすい。

情報ソース

より詳しくAIに聞いてみよう

  • ReactのPropsとは何かを、初心者向けに具体例つきで説明してください。
  • PropsとStateの違いを、実際の画面例で比較してください。
  • 親コンポーネントから子コンポーネントへ関数をpropsとして渡す例を教えてください。
  • TypeScriptでReactコンポーネントのPropsの型を定義する方法を教えてください。
  • Props Drillingが起きているReactコードを改善する方法を教えてください。