やさしいReact入門③

React

Propsとは?親子コンポーネントでデータを受け渡す方法をやさしく解説

Reactでコンポーネントを作成できるようになると、次に学ぶのがProps(プロップス)です。

前回の記事では、コンポーネントを作成し、Appコンポーネントから呼び出す方法を学びました。

しかし、そのままでは毎回同じボタンしか表示できません。

「送信」「保存」「キャンセル」など、表示内容や見た目を変えたい場合はどうすればよいのでしょうか?

そんなときに利用するのがPropsです。

この記事では、ReactにおけるPropsの役割や使い方、親子コンポーネント間でデータを受け渡す方法を初心者向けにわかりやすく解説します。


Propsとは?

Props(プロップス)は、親コンポーネントから子コンポーネントへデータを渡す仕組みです。

Reactでは、コンポーネント同士が親子関係を持っています。

App
 ├── Button
 ├── Button
 └── Button

親コンポーネントは、それぞれの子コンポーネントへいろんなデータを渡すことができます。

ポイント

Propsは「親 → 子」への一方向のデータ受け渡しです。Reactではこの仕組みを基本として画面を構築します。


なぜPropsが必要なの?

前回作成したボタンは、次のような固定のものでした。

const Button = () => {
  return <button>ボタン</button>;
};

これでは、

  • 送信
  • 保存
  • キャンセル

といったボタンを作りたい場合、わざわざ別々のコンポーネントを作る必要があります。

Reactでは、この問題をPropsで解決します。


Propsを使ったデータの受け渡し

例えば親コンポーネントが、

  • ボタンの文字:送信
  • ボタンの色:blue

というデータをButtonコンポーネントへ渡すことで、表示内容やデザインを自由に変更できます。

これによって、同じButtonコンポーネントでも、

  • 送信(青)
  • 保存(緑)
  • キャンセル(グレー)

といったように、用途に応じて使い分けられるようになります。



Buttonコンポーネントを作成する

1. まず受け取るデータの型を定義する

今回のケースでは、Buttonコンポーネントは、親コンポーネント(App.tsx)から以下の2つの情報を受け取るとしましょう。

<Button text="文字" color="red" />

この場合、

  • text → ボタンに表示する文字
  • color → ボタンの色

です。

TypeScriptでは「このコンポーネントはどんなデータを受け取れるのか」を型で定義します。


type ButtonProps = {
  text: string;
  color: string;
};

これは、

Buttonコンポーネントは、textという文字列とcolorという文字列を受け取ります

という宣言です。

JavaでいうDTOやメソッドの引数定義に近い考え方です。

2. Propsを受け取る

Reactでは、親コンポーネントから渡されたデータを
Props(プロップス)
と呼びます。

例えば、

<Button text="文字" color="red" />

で渡した値は、Button側ではPropsとして受け取ります。

書き方は以下です。


const Button = ({ text, color }: ButtonProps) => {

({ text, color }: ButtonProps)

は、

このコンポーネントはButtonProps型のデータを受け取ります

という意味です。

{ text, color }

これはPropsから必要な値だけ取り出しています。

本来は以下のようにも書けます。


const Button = (props: ButtonProps) => {
  return (
    <button>
      {props.text}
    </button>
  );
};

ただ、Reactではよく以下のように短く書きます。


const Button = ({ text, color }: ButtonProps) => {

これは分割代入というJavaScriptの書き方です。


3. 受け取った値を画面に表示する


return (
  <button className={color}>
    {text}
  </button>
);

ここでは、

{text}

で受け取った文字を表示しています。

また、


className={color}

では、


color="red"

として渡された値をCSSのクラス名として利用しています。

つまり、


<button class="red">
  文字
</button>

のようになります。

CSS側で、


.red {
  color: red;
}

のように定義すれば、赤文字のボタンになります。

完成したButton.tsx


type ButtonProps = {
  text: string;
  color: string;
};


const Button = ({ text, color }: ButtonProps) => {
  return (
    <button className={color}>
      {text}
    </button>
  );
};


export default Button;

コンポーネントのデータの流れ

今回の一番大事なポイントはここです。

App.tsx
  |
  | text="文字"
  | color="red"
  ↓
Button.tsx
  |
  | Propsとして受け取る
  ↓
画面表示

Reactでは、このように


親コンポーネントがデータを渡し、子コンポーネントが受け取って表示する

という流れが基本になります。


親コンポーネントからPropsを渡す

子コンポーネントへは、HTMLの属性を書くような感覚でデータを渡します。

<Button
  text="送信"
  color="blue"
/>

<Button
  text="キャンセル"
  color="gray"
/>

同じButtonコンポーネントでも、渡すPropsを変更するだけで表示内容を簡単に切り替えられます。


TypeScriptが型をチェックしてくれる

Propsには型を定義しているため、誤ったデータを渡すとTypeScriptがエラーを検出してくれます。

<Button
  text= 100
  color="blue"
/>

この例では、textには文字列を渡す必要があるため、数値を指定するとエラーになります。

補足

TypeScriptを利用することで、実行前にミスへ気付けるため、より安全にReactアプリケーションを開発できます。


Propsでは関数も渡せる

Propsでは文字列や数値だけでなく、関数も渡すことができます。

const handleClick = () => {
  alert("クリックされました");
};

<Button
  text="送信"
  color="blue"
  onClick={handleClick}
/>

ボタンがクリックされたときの処理などは、このように親コンポーネントから渡すケースが非常によくあります。


Propsを利用するメリット

Propsを利用することで、次のようなメリットがあります。

  • 同じコンポーネントを何度でも再利用できる
  • 表示内容だけを簡単に変更できる
  • コードの重複を減らせる
  • 保守しやすい設計になる

ポイント

Reactでは「表示は同じ、内容だけ違う」というケースでPropsが非常によく利用されます。


まとめ

PropsはReact開発において最も重要な機能の一つです。

同じコンポーネントを使い回しながら、表示内容や動作だけを変更できるため、保守性・再利用性の高いアプリケーションを作成できます。

Reactらしいコンポーネント設計を身につけるためにも、まずはPropsを使ったデータ受け渡しに慣れていきましょう。

コメント

タイトルとURLをコピーしました