ReactのPropsとは?〜コンポーネント間でデータを受け渡す仕組み〜

こんにちは、Reiです!

コンポーネントを分けられるようになると、
こんな場面に遭遇すると思います。

  • 見た目は同じなのに、表示する文字だけ変えたい
  • ボタンの形は同じで、処理だけ変えたい

そんなときに使うのが Props(プロップス) です。

Propsを使うと、同じコンポーネントを使いながら
「中身だけ変える」ことができるようになります。


今回は、Propsとは何かという基本から、
実際にどう使うのかまで整理していきます!


同じ見た目で中身だけ変えたいときは?

たとえば Message という
メッセージ表示用の部品があるとします。

この部品を使って、

  • ある場所では「お元気ですか?」
  • 別の場所では「元気です!」

と表示したい場合、
毎回コンポーネントを作り直すこともできますが、
それだと同じ見た目のコードがどんどん増えてしまいます 💦


ここで考えたいのが、
「見た目はそのままで、中身だけ変えられないか?」 ということです。


親コンポーネントと子コンポーネント

Reactでは、コンポーネントの中で
別のコンポーネントを呼び出して使うことができます。

export const App = () => {
return <Message />;
};

このときの関係はこうなります。

・呼び出す側(App) → 親コンポーネント
・呼び出される側(Message) → 子コンポーネント

この親子関係の中で、
親から子へ値を渡すことで、
同じコンポーネントでも表示を変えられるようになります。

この仕組みが Props です。


親はタグに値を書いて子へ渡す

Propsは、親コンポーネントから子コンポーネントへ渡します。

書き方は、HTMLの属性にかなり近いです。

import { Message } from "./components/Message";

export const App = () => {
  return (
    <>
      <h1>挨拶アプリ</h1>
      <Message color="blue" content="お元気ですか?" />
      <Message color="pink" content="元気です!" />
    </>
  );
};

同じ「Message」を使っていますが、
渡している値が違うので表示も変わります。

このように、
親で値を変えるだけで、同じコンポーネントを使い回せるのがPropsのポイントです。


子は受け取ったPropsを使って表示する

子コンポーネントでは、渡された値を受け取って使います。

親コンポーネントから渡された値は、関数の引数として props という形で受け取ります。

export const Message = (props) => {
  return <p>{props.content}</p>;
};

propsの中には、親から渡された値がまとまって入っているため、

  • props.content
  • props.color

のように取り出して使います。


分割代入でスッキリ書く

props.xxx と書き続けると少し見づらくなるため、
よく使われるのが分割代入です。

export const Message = ({ color, content }) => {
const contentStyle = {
color,
fontSize: "20px",
}; return <p style={contentStyle}>{content}</p>;
};

この書き方にすると、

・どのPropsを使っているか一目で分かる
・コードがすっきりする

というメリットがあります。


タグの中身は children で受け取る

Propsは属性だけでなく、
タグの中身も渡すことができます。

親側:

<Message color="green">タグで囲んだメッセージです</Message>

子側:

export const Message = ({ color, children }) => {
return <p style={{ color }}>{children}</p>;
};

children には、タグの間に書いた内容がそのまま入ります。

この仕組みを使うと、
「中身を自由に差し替えられるコンポーネント」を作れるようになります。


Propsは書き換えられない

Propsは、親から渡される「読み取り専用のデータ」です。

そのため、子コンポーネントの中で
値を書き換えることはできません。

// NG例
props.content = "別の内容";

こういった変更はReactのルールとして禁止されています。

値を変えたい場合は、

・親で値を変えて渡す
・またはStateを使う

という形になります。


関数もPropsで渡せる

Propsでは、値だけでなく関数も渡せます。

const ActionButton = ({ label, onClick }) => {
return <button onClick={onClick}>{label}</button>;
};export const App = () => {
const handleClick = () => {
alert("親コンポーネントで処理を実行しました!");
}; return <ActionButton label="保存する" onClick={handleClick} />;
};

このようにすると、

・見た目(ボタン)は子が担当
・処理の内容は親が決める

という役割分担ができます。


同じボタンでも、

・保存
・削除
・画面遷移

など、動きを変えられるようになります!


Propsが分かると設計が楽になる

Propsは単なるデータの受け渡しではなく、
役割を分けるための仕組みです。

・親:値や処理を用意する
・子:それを使って表示・実行する

この考え方で整理すると、
コードの見通しがかなり良くなります。


迷ったときは、

・値を決めているのはどこか
・表示しているのはどこか

この2つを意識してみてください!


まとめ

今回は、Propsの基本を見てきました。
Propsは、親コンポーネントから子コンポーネントへ渡すデータです。

\\ 今回のまとめ //

・親は属性のように値を渡す
・子は受け取って表示や処理に使う
・childrenでタグの中身も渡せる
・関数も渡せるので動きも変えられる


最初は少し混乱しやすいですが、
「渡すのは親、使うのは子」と考えると整理しやすくなります。

次は、コンポーネント自身が値を持つ仕組み、
Stateについて見ていきましょう!

コメント

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