1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ReactにおけるPropsの原則まとめ

Last updated at Posted at 2025-03-01

最近React/Next.jsの学習をしております。

Reactでコンポーネント間でデータを受け渡す際には
propsを利用します。

しかし、はじめてReactに触れる方は
「propsはどのように使えばいいの?」
「なぜ変更してはいけないの?」などの疑問を持つことが多いです。
私がそうでした。

そこで本記事では、私のような初学者向けに
Reactにおけるpropsの基本的な使い方と原則について簡潔にまとめます。

1. Propsとは?

親コンポーネントから子コンポーネントに渡すデータ(仕組み)
コンポーネントは、渡されたpropsを受け取って描画します。

例:親→子へ文字列を渡す場合

// 親コンポーネント
function App() {
  return <Hello name="React" />;
}

// 子コンポーネント
function Hello(props) {
  return <h1>Hello, {props.name}!</h1>;
}

export default App;

このように、App コンポーネントが Hello コンポーネントへ "React" という値を渡されて"Hello React"という結果となります。

イメージこんな感じ

┌─────────────────┐
│ 親コンポーネント │ App
│  (propsを渡す)   │
└─────────────────┘
          |
          |  name="React"
          ▼
┌─────────────────┐
│ 子コンポーネント │ Hello
│  (propsを受け取る)│
└─────────────────┘
          |
          |  return <h1>Hello, {props.name}!</h1>
          ▼
  ブラウザ上に「Hello, React!」と表示

2. Propsは「読み取り専用」

Reactでは、propsは読み取り専用 (read-only) という原則があります。
これは 「子コンポーネントは受け取ったpropsを変更してはいけない」 というルールです。

function Hello(props) {
  // 受け取ったpropsを直接変更
  props.name = "Vue"; // ❌ こういった操作は行わない

  return <h1>Hello, {props.name}!</h1>;
}

このようにpropsを直接変更すると、Reactの設計方針に反するため
予期しない挙動を引き起こす可能性があります。
また、厳密モード(Strict Mode)やTypeScriptの監視を入れている場合は警告・エラーに繋がります。

3. なぜ読み取り専用なのか?

Reactは 「一方向データフロー(One-way data flow)」 を基本としておりデータは上位(親)から下位(子)へと流れます。
もし子コンポーネントがpropsを自由に変更できると、データの流れが複雑になってしまい、状態管理が難しくなります。

シンプルに管理するためのルールとして、Reactは

親 → 子 へデータを渡す
子はpropsを参照のみ行う
更新が必要な場合は、親が状態を持ち、setStateなどで更新して再描画する
という設計を採用しています。

4. 状態を変更したいなら「State」を使う

propsはあくまでも受け取るだけなので、「値を更新したい場合はどうすれば?」 という疑問が出てきます。

Reactでは、状態を変更したい場合はuseStateなどを利用し
「State(状態)」 として管理します。
Stateとはコンポーネント内部で保持する変更可能なデータのことです。

例:count という状態を管理するコンポーネント

import React, { useState } from "react";

function Counter({ init }) {
  // 親から渡された init を元に、コンポーネント内の state を初期化
  const [count, setCount] = useState(init);

  const increment = () => setCount(count + 1);

  return (
    <>
      <p>Count: {count}</p>
      <button onClick={increment}>Increment</button>
    </>
  );
}

export default Counter;

このとき、init は単に「初期値」として読み取り
実際に値を更新したい場合はcountというstateを操作します。
init自体は読み取り専用のpropsのため変更しません。

5. まとめ

  • propsは読み取り専用
  • 一方向データフローを守るため、変更したい場合は親コンポーネントがstateを管理し、子コンポーネントに再度渡す
  • 値を更新したい場合は「state」を使用する

Reactの基本的なデータフローを理解しておくと
コンポーネント同士のデータの受け渡しがシンプルかつ明確になります。
初心者の方は特に 「propsは読み取り専用」 というルールを守るところから始めると、Reactの開発がスムーズになります。

個人的に見返すために記載しているため
何か違っている点や追加事項などございましたら
コメント欄でご教授いただけますと幸いです。

参考資料

これからはじめるReact実践入門 コンポーネントの基本からNext.jsによるアプリ開発まで

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?