第19回:Context API入門:Propsバケツリレーを卒業しよう

lang

これまでの学習では、データを「親から子へ」Propsを使って渡してきました(第5回:Props参照)。しかし、アプリが大きくなると、ある問題が発生します。

例えば、「ユーザーのログイン情報」を5階層下のコンポーネントで使いたい場合、途中の4つのコンポーネントはそのデータを使わないのに、ただ下に渡すためだけにPropsを受け取らなければなりません。 これを「Propsバケツリレー(Prop Drilling)」と呼びます。

2026年のReact開発において、このバケツリレーを回避し、どこからでも直接データを取り出せるようにするのが Context API(コンテキストAPI) です。


1. Context APIの3つの主役

Contextを使うには、3つのステップが必要です。

  1. createContext: データの「入れ物」を作る。
  2. Provider: データを「配信」する(親で囲む)。
  3. useContext: データを「受け取る」(子で呼び出す)。

2. 【実践】どこでも使える「ユーザー名」を表示する

Propsを使わずに、深い階層のコンポーネントでユーザー名を表示してみましょう。

JavaScript

import React, { createContext, useContext, useState } from 'react';

// 1. Context(入れ物)を作成
const UserContext = createContext<String>("");

export default function App() {
  const [user] = useState("テック太郎");

  return (
    // 2. Providerで包み、渡したい値を value に入れる
    <UserContext.Provider value={user}>
      <div style={{ textAlign: 'center', marginTop: '50px' }}>
        <h1>メイン画面</h1>
        <MiddleComponent />
      </div>
    </UserContext.Provider>
  );
}

// 中間のコンポーネント(Propsは一切受け取らない!)
function MiddleComponent() {
  return (
    <div style={{ border: '1px solid #ccc', padding: '10px' }}>
      <h3>中間のコンポーネント</h3>
      <LastComponent />
    </div>
  );
}

// データを実際に使うコンポーネント
function LastComponent() {
  // 3. useContextを使って、Contextから値を直接取り出す
  const name = useContext(UserContext);

  return (
    <p style={{ color: 'blue' }}>
      こんにちは、<strong>{String(name)}</strong> さん!
    </p>
  );
}

CodeSandboxでContext APIのデータ共有を体験する


3. コードの解説

  • UserContext.Provider: このタグで囲まれた範囲内であれば、どんなに深い階層でも value に入れたデータにアクセスできます。
  • useContext(UserContext): 「どのContextから値を取り出すか」を指定します。Propsを一切経由せずにデータが届くのが魔法のようです。

2026年の学び:Contextの使い所

2026年現在、全てのデータをContextに入れるのは避けられています。

  • 向いているデータ: ログインユーザー情報、サイトのテーマ(ダークモード等)、多言語対応の設定など、アプリ全体で使うもの。
  • 向いていないデータ: 特定の入力フォームの文字など、その場限りのもの。

これらを使い分けるのが、設計のセンスです。


今回のまとめ

  1. Context API は、Propsを使わずにデータを「ワープ」させる技術。
  2. Provider で配信し、useContext で受け取る。
  3. バケツリレー を防ぎ、コードをスッキリさせることができる。

次回予告:さらに高度な状態管理へ

Contextは便利ですが、データの更新が頻繁にあるとパフォーマンスが落ちることがあります。もっと複雑な状態を「型」に守られながら管理するにはどうすればいいでしょうか?

次回、「第20回:useReducer入門:複雑なState更新をルール化して管理する方法」。 useStateの進化系、プロレベルの状態管理術を伝授します。お楽しみに!


本日の宿題: Contextの中に「ユーザー名」だけでなく「好きな色」も入れて、一番下のコンポーネントの背景色を変えられるように改造してみてください!

コメント

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