カテゴリ: React 更新日: 2025/12/26

ReactのProps Drillingとは?コンテキストAPIで解決する方法を初心者向けに徹底解説

Props Drillingとは?コンテキストAPIで解決する方法
Props Drillingとは?コンテキストAPIで解決する方法

先生と生徒の会話形式で理解しよう

生徒

「先生、Reactでコンポーネントにデータを渡すときに、やたらとコードが長くなることがあるんですけど、あれって何なんですか?」

先生

「それは『Props Drilling(プロップス ドリリング)』と呼ばれる現象ですね。」

生徒

「プロップス ドリリング?なんだか難しそうです。どういう意味なんですか?」

先生

「簡単にいうと、必要なデータを本当に使うコンポーネントに届けるために、間にあるたくさんのコンポーネントへバケツリレーのように渡してしまう状態のことです。」

生徒

「なるほど、バケツリレーみたいな感じなんですね!でも、それって直せるんですか?」

先生

「はい、『Context API』を使えば解決できますよ。それでは、具体的に見ていきましょう。」

1. Props Drillingとは?

1. Props Drillingとは?
1. Props Drillingとは?

Reactでは、Props(プロップス)という仕組みを使って親コンポーネントから子コンポーネントへデータを渡します。Propsは非常に便利ですが、深い階層にあるコンポーネントへデータを渡そうとすると、間にあるコンポーネントすべてで同じデータを受け渡ししなければならなくなります。この状態をProps Drilling(プロップス ドリリング)と呼びます。

たとえば、アプリ全体で「ユーザー名」を表示したい場合を考えてみましょう。トップレベルのAppコンポーネントがユーザー名を持っているとき、深い階層のコンポーネントに渡すには、間にあるコンポーネントが必要なくてもPropsを中継し続けることになります。これはまさに「データのバケツリレー」です。

2. Props Drillingのデメリット

2. Props Drillingのデメリット
2. Props Drillingのデメリット

Props Drillingにはいくつかの問題点があります。

  • コードが冗長になる:必要のないコンポーネントでもPropsを受け渡すため、コードが長く読みにくくなります。
  • 保守性が下がる:データの受け渡し経路が複雑になり、修正するときにどのコンポーネントを触ればいいのか分かりにくくなります。
  • 柔軟性がなくなる:中間のコンポーネントがPropsを使わないのに変更が必要になり、無駄な修正が発生します。

このように、アプリが大きくなるほどProps Drillingは開発を難しくしてしまいます。

3. Context APIでProps Drillingを解決する

3. Context APIでProps Drillingを解決する
3. Context APIでProps Drillingを解決する

そこで役立つのがContext API(コンテキスト エーピーアイ)です。Context APIを使うと、親コンポーネントで用意したデータをアプリ全体、または特定の範囲のコンポーネントに直接共有できます。つまり、間にあるコンポーネントでバケツリレーをする必要がなくなるのです。

Context APIの使い方は、大きく分けて以下の3つのステップです。

  1. Contextを作成する
  2. Provider(プロバイダー)でデータを配布する
  3. useContextフックでデータを受け取る

4. Context APIのサンプルコード

4. Context APIのサンプルコード
4. Context APIのサンプルコード

それでは実際に、ユーザー名をContext APIで渡す例を見てみましょう。


import React, { createContext, useContext } from "react";

// 1. Contextを作成
const UserContext = createContext();

function App() {
  const user = "太郎";

  return (
    // 2. Providerで配布
    <UserContext.Provider value={user}>
      <Layout />
    </UserContext.Provider>
  );
}

function Layout() {
  return (
    <div>
      <h2>レイアウトコンポーネント</h2>
      <Content />
    </div>
  );
}

function Content() {
  // 3. useContextで取得
  const user = useContext(UserContext);
  return <p>こんにちは、{user}さん!</p>;
}

export default App;
(画面に「レイアウトコンポーネント」と表示され、その下に「こんにちは、太郎さん!」と表示されます)

5. Context APIを使うときの注意点

5. Context APIを使うときの注意点
5. Context APIを使うときの注意点

Context APIはとても便利ですが、使いすぎると逆に管理が難しくなることがあります。注意すべきポイントを整理しておきましょう。

  • 必要な場面でだけ使う:すべてのProps Drillingをなくすために安易に導入すると、どのデータがどこから来ているのか把握しづらくなります。
  • 複雑な状態管理には専用ライブラリを検討:ReduxやRecoilのような状態管理ライブラリは、アプリが大規模になるときに役立ちます。
  • 小規模なアプリではPropsで十分:シンプルなアプリなら無理にContext APIを使う必要はありません。

つまり、Context APIはProps Drillingを解決する強力な道具ですが、適材適所で使うことが大切なのです。

まとめ

まとめ
まとめ

Props DrillingとContext APIの関係をあらためて振り返ると、Reactでコンポーネント同士がどのようにデータを受け渡しているのかがよく理解できます。アプリが小さいうちは単純なPropsの受け渡しだけで問題なく動きますが、構造が複雑になると「必要のないコンポーネントまでPropsを通さなければならない」という状況が増えていきます。これがいわゆるProps Drillingで、コンポーネントが深くなるほど受け渡し経路が長くなり、コードの見通しが悪くなってしまいます。とくに複数のデータを扱う場合や、ユーザーに関連した情報をさまざまな場所で使いたい場面では、この問題が非常に大きく感じられるようになります。

そのようなときに登場するのがContext APIです。Context APIはコンポーネント間の距離に関係なく、必要なコンポーネントへデータを直接共有できる仕組みです。Propsを中継する必要がなくなるため、コードがすっきりし、保守もしやすくなります。たとえばユーザー情報、テーマ設定、言語設定など、アプリ全体で共有する必要のあるデータはContextと相性が良く、バケツリレーのように中継する手間を一気になくすことができます。

また、Context APIは最初の導入こそ少し難しく感じるかもしれませんが、仕組みはとてもシンプルです。「Contextを作る」「Providerで値を渡す」「useContextで受け取る」という三つのステップだけで完結します。この構造が理解できるようになると、Propsだけに頼る必要がなくなり、アプリ全体の設計に柔軟性が生まれます。

ここで、今回学んだ内容をさらに深めるために、Context APIで複数の値を管理するサンプルプログラムを掲載します。同じコンテキストでテーマとユーザー両方を管理する例で、実務でもよく登場するパターンです。

サンプルプログラム:複数のデータをContextでまとめて扱う


import React, { createContext, useContext } from "react";

// 複数の情報をまとめたContext
const AppContext = createContext();

function App() {
  const data = {
    user: "花子",
    theme: "dark"
  };

  return (
    <AppContext.Provider value={data}>
      <Dashboard />
    </AppContext.Provider>
  );
}

function Dashboard() {
  return (
    <div>
      <h1>ダッシュボード</h1>
      <UserInfo />
      <ThemeInfo />
    </div>
  );
}

function UserInfo() {
  const { user } = useContext(AppContext);
  return <p>ログインユーザー: {user}</p>;
}

function ThemeInfo() {
  const { theme } = useContext(AppContext);
  return <p>テーマ設定: {theme}</p>;
}

export default App;

このコードのように、Context APIを使えば複数の値をひとまとめにしてアプリ全体へ配布できます。Propsだけで同じことをしようとすると、すべてのコンポーネントにuserとthemeを渡し続ける必要があり、規模が大きくなるほど管理が難しくなります。しかしContextを利用することで、必要なコンポーネントが必要な値だけを取り出せるため、コンポーネント同士の依存関係がすっきりし、結果として開発効率も向上します。

とはいえ、Context APIを万能と思いすぎないことも大切です。あまりに多くのデータをContextに入れすぎると、どのコンポーネントがどのデータを使っているのか分かりづらくなり、逆に複雑さが増してしまうことがあります。そのため、Contextは「広く共有したいデータ」に絞って導入するのがよく、中規模以上のアプリではRedux、Recoil、Zustandなどを併用するケースも多くあります。つまり、Context APIはProps Drillingを解消するための強力な技術でありながら、用途を見極めることも重要ということです。

Props Drillingの問題を知り、Context APIでその仕組みを整理することで、Reactアプリはより読みやすく、拡張しやすく、変更に強い構造になります。今回の学びが、今後のコンポーネント設計の大きな助けになるはずです。Reactを使って複雑な画面を作るときほど、データの受け渡しをどう設計するかがアプリの品質に直結します。今回の内容を意識しながら実際のプロジェクトでも使い、Propsの流れを整理しながらContextを適切に活用することで自然と理解も深まっていきます。

先生と生徒の振り返り会話

生徒:「Props Drillingがどうして問題になるのか、実際にコードで見てすごくよく分かりました。データを何段も渡していくのは大変ですね。」

先生:「そのとおりです。階層が深くなるほどコードが複雑になり、無駄な受け渡しが増えてしまいます。」

生徒:「Context APIを使うと必要なコンポーネントだけが直接データを受け取れるから便利なんですね!」

先生:「そうです。Providerがデータを広く配布し、useContextで必要なものだけ取り出せます。」

生徒:「でも、使いすぎると分かりにくくなるっていうのは意外でした。」

先生:「便利だからといって全部Contextに入れると管理が逆に難しくなります。使う場面を選ぶのが大切ですね。」

生徒:「今回のサンプルも応用して、複数の値をまとめて配布する方法も理解できました!」

先生:「実際のアプリでもよく使うテクニックです。Props Drillingに困ったらぜひ使ってみてください。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

ReactのProps Drillingとは何ですか?

ReactのProps Drillingとは、データを必要とする子コンポーネントに渡すために、不要な中間コンポーネントにもPropsを通す必要がある状態のことを指します。バケツリレーのようにデータを渡していくため、コードが冗長になります。
カテゴリの一覧へ
新着記事
New1
React
Reactコンポーネントの再利用と分割を完全マスター!初心者でもわかるコンポーネント設計
New2
React
ReactでAxiosインターセプターの使い方を完全ガイド!初心者でもわかるリクエストとレスポンスの処理方法
New3
React
JSXの書き方!初心者でもわかるReactタグと属性の基本ルール解説
New4
React
ReactとDockerを使った開発環境構築の基本を徹底解説!初心者でもわかるReactとDockerの連携方法
人気記事
No.1
Java&Spring記事人気No1
React
ReactでonChangeイベントを使ってフォーム入力値を管理する方法を初心者向けに解説
No.2
Java&Spring記事人気No2
React
Reactのイベントハンドリングのアンチパターンまとめ!初心者でもわかる注意点
No.3
Java&Spring記事人気No3
React
ReactとTypeScriptの環境構築をやさしく解説!Viteとtsconfigの設定も丁寧に紹介
No.4
Java&Spring記事人気No4
React
Reactのカスタムフックの作り方を完全ガイド!再利用可能なロジックを切り出す仕組み
No.5
Java&Spring記事人気No5
React
ReactでFetch APIのローディング状態を管理する方法|初心者にもわかる解説
No.6
Java&Spring記事人気No6
React
ReactのuseStateとuseEffectでよくあるエラーと解決方法ガイド!初心者でもわかるReactフック
No.7
Java&Spring記事人気No7
React
create-react-appでReactプロジェクトを作成する手順を初心者向けに完全解説!
No.8
Java&Spring記事人気No8
React
Reactでファイルアップロードを実装する方法を解説!Fetch APIで画像やPDFを送る仕組みを初心者向けに紹介