🐒

ReactのuseContextについて学ぶ。

2025/01/04に公開

本記事ではReactのuseContextについて初心者向けに解説します。

「コンポーネント間でデータの受け渡しが大変...」
「propsのバケツリレーがつらい...」

そんな悩みを抱えているなら、useContextがおすすめです。
今回の記事では、以下のことが分かります。

  • useContextの基本的な使い方
  • いつuseContextを使うべきか
  • 具体的なコード例

それでは見ていきましょう。

useContextとは?

useContextは「コンポーネント間でデータを共有するための機能」です。
分かりやすく言うと...

データを1箇所で管理して
必要な場所で自由に取り出せる

という便利な機能です。
たとえば、こんな状況で使えます。

  • ユーザーの設定を画面全体で共有したい
  • ログイン状態をどこでも参照したい
  • 言語設定をアプリ全体で使いたい

useContextを使う前と後で何が変わるの?

まずは、useContextを使わない場合を見てみましょう。

// useContextを使わない場合
function App() {
  const userName = "太郎";
  return (
    <div>
      <Header userName={userName} />
      <Main userName={userName} />
      <Footer userName={userName} />
    </div>
  );
}

function Header({ userName }) {
  return <Nav userName={userName} />;
}

function Nav({ userName }) {
  return <div>ようこそ、{userName}さん</div>;
}

「あれ?何か面倒くさそう...」
そうです。データを使いたい場所まで、propsを次々と渡していく必要があります。

これが、useContextを使うとどう変わるかというと...

// useContextを使う場合
function App() {
  return (
    <UserContext.Provider value="太郎">
      <div>
        <Header />
        <Main />
        <Footer />
      </div>
    </UserContext.Provider>
  );
}

function Nav() {
  const userName = useContext(UserContext);
  return <div>ようこそ、{userName}さん</div>;
}

シンプルになりましたね。
useContextを使うと、必要な場所で直接データを取り出せます。

useContextの使い方:3ステップで解説

useContextは以下の3ステップで使えます。

ステップ1:コンテキストを作る

まずは、データを入れる箱を作ります。

// UserContext.js
import { createContext } from 'react';
export const UserContext = createContext();

ステップ2:データを準備する

次に、作った箱にデータを入れます。

// App.js
import { UserContext } from './UserContext';

function App() {
  const [user, setUser] = useState("太郎");

  return (
    <UserContext.Provider value={user}>
      {/* ここの中ならどこでもデータが使えます */}
      <div>
        <Header />
        <Main />
        <Footer />
      </div>
    </UserContext.Provider>
  );
}

ステップ3:データを使う

最後に、必要な場所でデータを取り出します。

// Nav.js
import { useContext } from 'react';
import { UserContext } from './UserContext';

function Nav() {
  const userName = useContext(UserContext);
  return <div>ようこそ、{userName}さん</div>;
}

これで完了です。

実践例:ダークモード切り替えを作ってみよう

では、実際にuseContextを使って、ダークモード切り替え機能を作ってみましょう。
まずはコンテキストを作ります

// ThemeContext.js
import { createContext } from 'react';
export const ThemeContext = createContext();

次に、テーマの切り替え機能を追加

// App.js
function App() {
  const [isDark, setIsDark] = useState(false);

  return (
    <ThemeContext.Provider value={{ isDark, setIsDark }}>
      <div className={isDark ? 'dark' : 'light'}>
        <Header />  {/* ThemeButtonをここに置くことが多い */}
        <Main />
        <Footer />
      </div>
    </ThemeContext.Provider>
  );
}

// Header.js
function Header() {
  return (
    <header>
      <h1>私のアプリ</h1>
      <ThemeButton />  {/* ここでThemeButtonを使用 */}
    </header>
  );
}

最後に、切り替えボタンを作る

// ThemeButton.js
function ThemeButton() {
  const { isDark, setIsDark } = useContext(ThemeContext);

  return (
    <button onClick={() => setIsDark(!isDark)}>
      {isDark ? '🌞 ライトモード' : '🌙 ダークモード'}
    </button>
  );
}

たったこれだけで、ダークモード切り替えができました!

useContextはいつ使うべき?

useContextは、以下の場合におすすめです。

  • アプリ全体で使う設定がある
  • 多くのコンポーネントで同じデータを使いたい
  • propsのバケツリレーを避けたい

でも、すべてのデータ共有にuseContextを使う必要はありません。
小規模な状態管理なら、普通のpropsで十分です。

まとめ:useContextの使い方

今回の内容をまとめると:

  • useContextは、データを共有するための便利な機能
  • 使い方は3ステップ(作る・準備する・使う)
  • アプリ全体の設定などを共有するのに最適

最初は難しく感じるかもしれません。
でも、基本的な使い方を理解してしまえば、とても便利な機能です。
ぜひ、実際のプロジェクトで試してみてください!

【よくある質問】

Q. 複数のコンテキストは使える?
A. はい、必要に応じて複数のコンテキストを使えます。ただし、使いすぎると管理が大変になるので注意!

Q. パフォーマンスは大丈夫?
A. コンテキストの値が変更されると、それを使用しているコンポーネントは再レンダリングされます。必要な場所でのみ使うようにしましょう。

Discussion