1
3

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・Stateを理解する

Last updated at Posted at 2025-11-16

はじめに

この記事で学べること

この記事では、Reactを学習する上で最も重要な3つの基本概念について解説します。

  • コンポーネント: UIを部品化する仕組み
  • Props: コンポーネント間でデータを受け渡す方法
  • State: コンポーネント内で変化するデータを管理する方法

これらの概念を理解することで、Reactアプリケーションの構造が明確になり、効率的な開発ができるようになります。

対象読者

  • Reactを学び始めたばかりの方
  • JavaScriptの基本文法を理解している方
  • コンポーネント、Props、Stateの違いがよく分からない方

Reactの3つの基本概念とは

なぜこれらの概念が重要なのか

Reactは「コンポーネント指向」のライブラリです。アプリケーション全体を小さな部品(コンポーネント)に分割し、それらを組み合わせてUIを構築します。この設計思想を支えるのが、コンポーネント、Props、Stateという3つの概念です。

これらを理解しないままReactを使うことは、文法を知らずに外国語を話そうとするようなものです。基礎をしっかり押さえることで、その後の学習がスムーズになりますね。

全体像の把握

まずは3つの概念の関係性を図で確認しましょう。

コンポーネントという部品の中で、Propsは外部から受け取るデータ、Stateは内部で管理するデータという役割分担があります。

コンポーネント(Component)

コンポーネントとは何か

コンポーネントは、UIの一部を表す再利用可能な部品のことです。ボタン、フォーム、カード、ヘッダーなど、画面上のあらゆる要素をコンポーネントとして定義できます。

例えば、Webページを家に例えると、コンポーネントは窓やドア、屋根といった部品に相当します。これらの部品を組み合わせることで、1つの家(アプリケーション)が完成するイメージですね。

関数コンポーネントとクラスコンポーネント

Reactには2種類のコンポーネント記述方法があります。

関数コンポーネント(現在の主流)

function Welcome() {
  return <h1>Hello, React!</h1>;
}

クラスコンポーネント(従来の方法)

class Welcome extends React.Component {
  render() {
    return <h1>Hello, React!</h1>;
  }
}

現在は関数コンポーネントが主流です。シンプルで読みやすく、Hooksという機能と組み合わせることで強力な機能を実現できます。この記事では関数コンポーネントを使って解説していきます。

コンポーネントの役割と利点

コンポーネントを使うことで、以下のようなメリットが得られます。

再利用性の向上
一度作成したコンポーネントは、アプリケーション内のどこでも再利用できます。ボタンコンポーネントを1つ作れば、それを複数の場所で使い回せるわけです。

保守性の向上
機能ごとにコンポーネントを分割することで、コードの見通しが良くなります。バグ修正や機能追加も、該当するコンポーネントだけを修正すれば済みます。

テストの容易性
小さな単位でコンポーネントを作ることで、個別にテストしやすくなります。

実際のコード例

シンプルなボタンコンポーネントを作ってみましょう。

// Buttonコンポーネントの定義
function Button() {
  return (
    <button className="custom-button">
      クリック
    </button>
  );
}

// Appコンポーネントで使用
function App() {
  return (
    <div>
      <h1>コンポーネントの例</h1>
      <Button />
      <Button />
      <Button />
    </div>
  );
}

このように、<Button />と記述するだけで、同じボタンを何度でも配置できます。

Props(プロパティ)

propsとは何か

Propsは「Properties(プロパティ)」の略で、親コンポーネントから子コンポーネントへデータを渡すための仕組みです。HTMLの属性のようなイメージで、コンポーネントに外部から値を渡すことができます。

propsの使い方

Propsはコンポーネントの引数として受け取ります。

// 子コンポーネント:propsを受け取る
function Greeting(props) {
  return <h1>こんにちは{props.name}さん!</h1>;
}

// 親コンポーネント:propsを渡す
function App() {
  return (
    <div>
      <Greeting name="太郎" />
      <Greeting name="花子" />
      <Greeting name="次郎" />
    </div>
  );
}

name="太郎"のように属性を指定すると、子コンポーネント内でprops.nameとしてその値にアクセスできます。

親コンポーネントから子コンポーネントへのデータ受け渡し

Propsによるデータの流れは常に一方向です。親から子へという明確な方向性があることで、データの流れが追いやすくなります。

propsの特徴(読み取り専用)

Propsには重要な制約があります。それは読み取り専用(Read-only)であることです。子コンポーネント内でpropsの値を直接変更することはできません。

function BadExample(props) {
  // これはエラー!propsは変更できない
  props.name = "新しい名前"; // NG
  
  return <h1>{props.name}</h1>;
}

この制約により、データの流れが予測可能になり、バグの発生を防げます。

実際のコード例

複数のpropsを受け取る例を見てみましょう。

// UserCardコンポーネント
function UserCard(props) {
  return (
    <div className="user-card">
      <h2>{props.name}</h2>
      <p>年齢: {props.age}</p>
      <p>職業: {props.job}</p>
    </div>
  );
}

// Appコンポーネント
function App() {
  return (
    <div>
      <UserCard 
        name="山田太郎" 
        age={28} 
        job="エンジニア" 
      />
      <UserCard 
        name="佐藤花子" 
        age={25} 
        job="デザイナー" 
      />
    </div>
  );
}

分割代入を使うとさらにスッキリ書けますね。

function UserCard({ name, age, job }) {
  return (
    <div className="user-card">
      <h2>{name}</h2>
      <p>年齢: {age}</p>
      <p>職業: {job}</p>
    </div>
  );
}

State(状態)

Stateとは何か

Stateは、コンポーネントが内部で管理する変化するデータのことです。ユーザーの操作や時間経過によって変わる値を扱う場合に使用します。

例えば、いいねボタンのクリック回数、フォームの入力内容、モーダルの開閉状態などがStateで管理されます。

useStateフックの使い方

関数コンポーネントでStateを使うには、useStateというHooks(フック)を使用します。

import { useState } from 'react';

function Counter() {
  // [現在の値, 更新関数] = useState(初期値)
  const [count, setCount] = useState(0);
  
  return (
    <div>
      <p>カウント: {count}</p>
      <button onClick={() => setCount(count + 1)}>
        +1
      </button>
    </div>
  );
}

useStateは配列を返します。1つ目の要素が現在の値、2つ目の要素が値を更新するための関数です。

Stateの更新方法

Stateを更新する際は、必ず更新関数(上の例ではsetCount)を使用します。

// 正しい方法
setCount(count + 1);

// 間違った方法
count = count + 1; // これはNG!

直接変数を書き換えても、Reactは変更を検知できず、画面が更新されません。必ず更新関数を使いましょう。

Stateの特徴(変更可能)

Propsと異なり、Stateは変更可能です。ただし、前述の通り更新関数を通じて変更する必要があります。

Stateが更新されると、Reactは自動的にコンポーネントを再レンダリング(再描画)します。これにより、画面が最新の状態に更新されるわけですね。

Props vs State - 何が違うのか

比較表での整理

PropsとStateの違いを表にまとめました。

項目 Props State
データの出所 親コンポーネントから受け取る コンポーネント内で定義
変更可能性 読み取り専用(変更不可) 変更可能
変更方法 - 更新関数を使用
用途 コンポーネント間のデータ受け渡し コンポーネント内のデータ管理
再レンダリング propsが変わると再レンダリング stateが変わると再レンダリング

使い分けのポイント

どちらを使うか迷った時は、以下の基準で判断しましょう。

Propsを使う場合

  • 親コンポーネントからデータを受け取りたい
  • コンポーネントを再利用可能にしたい
  • データを変更する必要がない

Stateを使う場合

  • ユーザーの操作で値が変わる
  • 時間経過で値が変わる
  • コンポーネント内でデータを管理したい

まとめ

重要ポイントの再確認

Reactの3つの基本概念について学びました。

コンポーネント

  • UIを部品化する仕組み
  • 再利用性と保守性を高める
  • 関数コンポーネントが現在の主流

Props

  • 親から子へデータを渡す
  • 読み取り専用で変更不可
  • コンポーネントを柔軟に再利用できる

State

  • コンポーネント内で変化するデータを管理
  • useStateフックで定義
  • 更新すると自動的に再レンダリングされる

これら3つの概念は、Reactアプリケーション開発の土台となります。最初は難しく感じるかもしれませんが、実際に手を動かしてコードを書くことで、自然と理解が深まっていきますよ。

1
3
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
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?