Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】React Props: How to Pass Data between Components?

2025年09月18日に「Dev.to」が公開したITニュース「React Props: How to Pass Data between Components?」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Reactのコンポーネント間でデータを受け渡す仕組みが「Props(プロパティ)」だ。Propsを使うと、親から子へデータを一方向で渡せる。子はPropsを読み取るだけで、直接変更はできない。様々なデータ型を渡せ、再利用性の高いコンポーネント開発に役立つ。子から親へはコールバック関数を使う。

ITニュース解説

現代のウェブ開発において、Reactは非常に人気のあるJavaScriptライブラリの一つだ。主にシングルページアプリケーションと呼ばれる、ページ遷移なしで動的な表示が可能なウェブサイトを構築する際に利用される。Reactで作られるアプリケーションは、『コンポーネント』と呼ばれる独立した部品の集まりで構成されている。これらのコンポーネントは、それぞれが特定の役割を持ち、組み合わさることで一つの大きなアプリケーションを作り上げている。例えば、ウェブサイトのヘッダー部分、サイドバー、メインコンテンツ、フッターなど、それぞれが独立したコンポーネントとして設計されるイメージだ。

しかし、部品であるコンポーネントがそれぞれ独立しているだけでは、アプリケーション全体としての機能を実現することは難しい。例えば、ユーザーの名前を表示するヘッダーコンポーネントと、そのユーザーのプロフィールを表示するメインコンテンツコンポーネントがあった場合、両者で同じユーザー情報を使う必要があるだろう。このように、コンポーネント間でデータをやり取りする仕組みが不可欠となる。そこで登場するのが、『Props』(プロップス)だ。

Propsは、Reactにおけるコンポーネント間でデータを渡すための主要な方法であり、『プロパティ』の略称でもある。これは、親となるコンポーネントから、その中に含まれる子コンポーネントへデータを送るための仕組みだ。データは常に一方向、つまり親から子へと一方的に流れるのがReactの大きな特徴である。子コンポーネントは、親から受け取ったPropsのデータを直接変更することはできない。これは非常に重要なルールで、Propsはあくまで『読み取り専用』のデータとして扱われる。この制約があることで、アプリケーション内のデータの流れが予測しやすくなり、バグの発生を抑えることにも繋がる。

Propsを利用することで、コンポーネントはより動的で再利用性の高いものになる。例えば、同じデザインのボタンコンポーネントがあったとして、表示するテキストだけをPropsで渡すことで、『保存』ボタンにも『キャンセル』ボタンにも対応できる。このように、一度作ったコンポーネントを様々な状況で使い回せるようになるため、開発効率が大幅に向上する。

具体的なPropsの渡し方を見てみよう。JavaScriptの関数に引数を渡すのと似た感覚で、コンポーネントに属性として値を指定する。例えば、『Greeting』という名前のコンポーネントがあったとして、それに名前を渡したい場合、親コンポーネントから<Greeting name="John" />のように記述する。このname="John"の部分がPropsだ。子コンポーネントであるGreetingは、このnameというPropsを受け取り、内部で{name}this.props.nameといった形でその値(この場合は『John』)を利用して表示内容を生成する。もし別の場所で同じGreetingコンポーネントを使い、『Alice』という名前を表示したい場合は、<Greeting name="Alice" />と記述するだけでよい。これにより、例えば『Hello, John!』や『Hello, Alice!』といった異なる出力が簡単に実現できるのだ。

Reactにおけるデータの流れは、『単方向データフロー』が基本だ。これは、データの変更が常に一方向へ伝播することを意味し、システム全体の理解を容易にする。データの管理方法には、大きく分けて二つのパターンがある。一つは、各コンポーネントが自身で管理する『状態』(State)というデータだ。これはそのコンポーネント自身の内部でのみ変更が可能で、他のコンポーネントに直接影響を与えることはない。例えば、ボタンがクリックされるたびに数値が増減するカウンターコンポーネントを考えてみよう。このカウンターの数値は、そのカウンターコンポーネント自身が持っているStateとして管理される。数値が変更されると、そのコンポーネントだけが再描画され、変更が画面に反映される。useStateという機能を使ってこのようなローカルデータを管理する。

もう一つが、Propsを使った親から子へのデータ送信だ。これは、親コンポーネントが持つデータやStateを、子コンポーネントが必要とする際にPropsとして渡すケースを指す。子コンポーネントは受け取ったPropsを使って表示内容を生成したり、内部の処理を行ったりする。前述の通り、子コンポーネントはPropsの値を変更できないため、常に親コンポーネントがデータの源泉となる。これにより、データの整合性が保たれやすくなる。例えば、親コンポーネントが『Hello from Parent』というメッセージを持っていて、それを子コンポーネントに表示させたい場合、親コンポーネント内で子コンポーネントを呼び出す際に<Child msg="Hello from Parent" />のようにPropsとしてmsgを渡す。子コンポーネントは{ msg }という形でそれを受け取り、メッセージを表示する。

それでは、子コンポーネントから親コンポーネントへデータを渡したい場合はどうすればよいだろうか。直接Propsを子から親に送り返すことはできないため、別の方法を使う。それは、『コールバック関数』を利用する方法だ。親コンポーネントは、子コンポーネントに対して、データを受け取るための『関数』をPropsとして渡す。子コンポーネントは、何らかのイベント(例えばボタンクリック)が発生した際に、このPropsとして受け取った関数を呼び出し、引数として親に送りたいデータを渡す。これにより、親コンポーネントはそのデータを受け取り、自身のStateを更新したり、他の処理を行ったりすることができるようになる。 例として、子コンポーネントに『リンゴを送る』ボタンと『バナナを送る』ボタンがあり、どちらかをクリックしたときに、その果物の名前を親コンポーネントに知らせたい場合を考えてみよう。親コンポーネントは、現在選ばれている果物の名前を保持する『State』と、そのStateを更新する『関数』を持っている。親は子コンポーネントを呼び出す際に、この『Stateを更新する関数』をsendDataという名前のPropsとして子に渡す。子コンポーネントは、ボタンがクリックされたときに、Propsとして受け取ったsendData関数を呼び出し、引数に『Apple』や『Banana』といった果物の名前を渡す。すると、親コンポーネントのStateがその果物の名前に更新され、親コンポーネントの表示もそれに合わせて変更される。このように、親が子に『何かあったらこの関数を呼び出してね』とあらかじめ準備しておくことで、子から親へのデータ伝達が実現するのだ。

Propsは、単なる文字列だけでなく、JavaScriptで扱えるさまざまな種類のデータを渡すことができる。これは、コンポーネントの柔軟性をさらに高める要素だ。 文字列は、ウェブサイト上で最も頻繁に利用されるデータ型の一つだ。『Hello, World!』のようなテキストデータをPropsとして渡したい場合、コンポーネントの属性として値を直接ダブルクォーテーションで囲んで指定するか、JavaScriptの変数や式として波括弧で囲んで渡す。例えば、<Component title="ニュース" /><Component message={"今日のニュース"} />といった形になる。 数値もまた、Propsとして頻繁に利用されるデータ型だ。年齢や点数、商品の価格など、計算や比較に使われる数値を渡す場合、JavaScriptの式として認識させるために波括弧で囲む必要がある。例えば、<Product price={1000} /><Score value={95} />のように指定する。波括弧で囲むことで、単なる文字列ではなく、数値として扱われるため、子コンポーネント内で数値計算を行うことも可能になる。 配列もPropsとして渡すことができ、items={['item1', 'item2']}のように波括弧で囲んで指定する。子コンポーネントでは、受け取った配列に対してmap()メソッドなどを使って要素を一つずつ処理し、リスト表示などに利用することがよくある。また、user={{ name: "John", age: 25 }}のように、オブジェクトを渡すことも可能だ。これにより、複数の関連するデータをまとめて子コンポーネントに渡すことができる。前述の通り、イベントハンドラーなどの関数もPropsとして渡すことができ、ブール値(真偽値)もisActive={true}のように渡せる。

Propsを効果的に使うためには、いくつかのベストプラクティスがある。最も重要なのは、Propsが『読み取り専用』であることを常に意識することだ。子コンポーネント内でPropsの値を直接変更しようとするとエラーが発生したり、アプリケーションの予期せぬ動作に繋がったりする。Propsはあくまで親から子へ渡される『静的な設定情報』や『表示データ』として扱うべきだ。 また、Propsの名前は明確で分かりやすいものにすることが推奨される。例えば、ユーザー名を表すならname、メッセージならmessageといった具体的な名前を使うことで、他の開発者がコードを読んだときに、そのPropsがどのようなデータを期待しているのか、何を表しているのかをすぐに理解できるようになる。大規模なプロジェクトでは、Propsの型を検証する仕組み(TypeScriptやPropTypesなど)を導入することで、予期せぬ型のデータが渡されるのを防ぎ、より堅牢なアプリケーションを構築することも可能だ。

ReactのPropsは、コンポーネントベースのアプリケーションにおいて、データの流れを制御し、コンポーネントの再利用性と柔軟性を高めるための不可欠な要素だ。親から子への一方向データフローという基本的な原則を理解し、Propsの渡し方や利用できるデータ型、そして子から親へのデータ伝達におけるコールバック関数の活用法をマスターすることは、Reactアプリケーション開発の基礎を固める上で非常に重要である。これらの知識を身につけることで、あなたはより複雑で動的なウェブアプリケーションを効率的に構築できるようになるだろう。

関連コンテンツ

関連IT用語