Reactの本質 — UIは状態の関数である

Reactを一言で表すなら、「UIは状態の関数である」という思想に尽きます。 数式で書けば UI = f(state)。ある状態(state)を入力として渡せば、対応するUI(画面の見た目)が出力される。 これがReactの設計哲学の根幹です。

この考え方が革命的だった理由を理解するには、Reactが登場する以前のフロントエンド開発を振り返る必要があります。 jQueryに代表される従来の手法では、DOMを命令的(imperative)に操作していました。 「この要素を取得して」「テキストを変更して」「クラスを追加して」と、一つひとつの手順を開発者が記述する必要がありました。

観点 命令的アプローチ(jQuery等) 宣言的アプローチ(React)
開発者が記述すること 「どのように」UIを変更するか 「どのような」UIであるべきか
状態変更時の処理 差分を手動で計算・適用 Reactが自動で差分検出・適用
コード例(カウンター) $("#count").text(newVal) setCount(newVal)
複雑さの増加 DOM操作が指数的に増加 状態の管理に集中できる
バグの発生源 DOM状態とデータの不整合 状態が信頼できる唯一の情報源

たとえばToDoリストを考えてみましょう。命令的アプローチでは「リストにアイテムを追加する」「完了したアイテムに取り消し線を引く」「削除ボタンを押したら該当のDOM要素を消す」と、 状態が変わるたびに対応するDOM操作を漏れなく書く必要があります。 アイテムが100個、フィルター機能やソート機能が加わると、整合性を保つのは困難を極めます。

Reactの宣言的アプローチでは、開発者は「このstateの配列をもとに、こういうリストを表示する」と宣言するだけです。 stateが変われば、Reactが自動的にUIを更新してくれます。開発者は「今どういう状態か」だけを管理すればよいのです。

コンポーネントモデル — UIの構成単位

Reactでは、UIをコンポーネントと呼ばれる独立した部品に分割します。 ボタン、ヘッダー、サイドバー、カード — これらすべてがコンポーネントです。 コンポーネントは入れ子にでき、小さな部品を組み合わせて複雑なUIを構築します。

現在のReactでは関数コンポーネントが標準です。 JavaScriptの関数として定義し、JSX(後述)を返します。

// 関数コンポーネントの例
function Greeting({ name }) {
  return <h1>こんにちは、{name}さん!</h1>;
}

// 使用側
<Greeting name="太郎" />

Props — 親から子への一方向データフロー

コンポーネントに外部からデータを渡す仕組みがProps(プロパティ)です。 上の例では name="太郎" がPropsにあたります。 Propsは読み取り専用であり、子コンポーネントから変更することはできません。 この制約が、データの流れを予測可能にする鍵となっています。

children — 特殊なProp

コンポーネントの開始タグと閉じタグの間に挟んだ要素は、childrenという特殊なPropとして渡されます。 これにより、他のコンポーネントを「包む」コンポーネントを作ることができます。

// Cardコンポーネント — childrenを受け取って表示する
function Card({ title, children }) {
  return (
    <div className="card">
      <h2>{title}</h2>
      <div>{children}</div>
    </div>
  );
}

// 使用側 — 好きな中身を入れられる
<Card title="お知らせ">
  <p>明日はメンテナンスのためサービスを停止します。</p>
</Card>

コンポーネント合成の考え方

Reactでは継承よりも合成(Composition)が推奨されています。 小さなコンポーネントを組み合わせて大きなUIを構築するこのアプローチは、 コードの再利用性と保守性を飛躍的に高めます。 React公式ドキュメントでも「Reactを長く使ってきた中で、継承によるコンポーネント階層を使うべきケースは見つかっていない」と明記されています。

単方向データフロー — 予測可能なデータ管理

Reactのデータは常に親から子へ、一方向に流れます。 これを「単方向データフロー(Unidirectional Data Flow)」と呼びます。

graph TD
  A[親コンポーネント\nstate: items] -->|props| B[子コンポーネントA\nリスト表示]
  A -->|props| C[子コンポーネントB\n件数表示]
  B -->|コールバック関数| A
  C -->|コールバック関数| A

  style A fill:#3b82f6,stroke:#1d4ed8,color:#fff
  style B fill:#8b5cf6,stroke:#6d28d9,color:#fff
  style C fill:#8b5cf6,stroke:#6d28d9,color:#fff
Reactの単方向データフロー: Propsは上から下へ、イベントはコールバック関数で上へ伝達

親コンポーネントが状態(state)を持ち、子コンポーネントにPropsとして渡します。 子が親のstateを変更したい場合は、親から渡されたコールバック関数を呼び出します。 直接stateを書き換えるのではなく、「親に変更を依頼する」という仕組みです。

function Parent() {
  const [count, setCount] = useState(0);

  // 子に渡すコールバック関数
  const handleIncrement = () => setCount(count + 1);

  return <Child count={count} onIncrement={handleIncrement} />;
}

function Child({ count, onIncrement }) {
  // 子は直接stateを変更せず、コールバックを呼ぶ
  return <button onClick={onIncrement}>カウント: {count}</button>;
}

双方向バインディングとの対比

AngularやVueの一部機能では、UIの変更が自動的にデータに反映され、データの変更も自動的にUIに反映される双方向バインディングが採用されています。 一見便利ですが、アプリケーションが大規模になると「誰がこのデータを変更したのか」が分かりにくくなるという課題があります。

Reactの単方向データフローでは、データの変更箇所が明確です。 バグが発生した場合も、stateの変更をトップダウンに追跡すれば原因にたどり着けます。 この予測可能性こそが、大規模アプリケーション開発でReactが選ばれる理由の一つです。

JSX — JavaScriptの中のUI

ReactのコードにはHTMLのような記法が登場しますが、これはJSX(JavaScript XML)と呼ばれるJavaScriptの構文拡張です。 テンプレート言語ではなく、あくまでJavaScriptの表現力を維持したまま、UIを直感的に記述できる仕組みです。

JSXは最終的にJavaScriptの関数呼び出しに変換されます。 たとえば以下のJSXは:

<h1 className="title">Hello, world!</h1>

内部的には次のように変換されます:

React.createElement('h1', { className: 'title' }, 'Hello, world!')

つまりJSXは React.createElement()シンタックスシュガー(糖衣構文)です。 JSXを使わなくてもReactは書けますが、UIの構造が視覚的に分かりやすくなるため、ほぼすべてのReactプロジェクトで採用されています。

なぜReactが支持されるのか

2013年にFacebookがオープンソースとして公開して以来、Reactはフロントエンド開発の事実上の標準となりました。 その圧倒的な普及度を示すデータがあります:

  • 週間9,600万ダウンロード(npm、2026年3月時点)
  • GitHub Stars 244,000以上
  • 2023年Stack Overflow調査で最も使用されているWebフレームワーク(40.58%)

Reactがこれほど支持される理由は、技術的な優位性だけではありません。

「Learn once, write anywhere」

Reactの思想はWeb以外にも広がっています。 React Nativeを使えば同じReactの知識でiOS/Androidアプリが開発でき、 さらにReact Native for Windows/macOSでデスクトップアプリまでカバーできます。 一度Reactを学べば、さまざまなプラットフォームで活用できるのです。

巨大なエコシステム

状態管理(Redux、Zustand)、ルーティング(React Router)、UIライブラリ(MUI、shadcn/ui)、 データフェッチ(TanStack Query)、メタフレームワーク(Next.js、Remix)など、 Reactを取り巻くエコシステムは他のフレームワークを圧倒する規模を誇ります。 何か実現したいことがあれば、大抵は成熟したライブラリが見つかります。

また、企業の採用においてもReactの需要は圧倒的です。 フロントエンドエンジニアの求人で最も要求されるスキルがReactであり、 学習への投資対効果が非常に高い技術と言えるでしょう。

理解度チェック

問題 0 / 50%
Q1

Reactの宣言的UIの考え方を最もよく表す式はどれですか?

キーボード: 1〜4 で選択、Enter で回答