Reactでの開発が進むと、
親コンポーネントから子コンポーネントに情報を渡したい場面が増えてきます。
たとえば、ユーザーの設定やテーマカラーなど、
どのコンポーネントでも使える共通のデータを扱うとき、
毎回propsを使って一つひとつのコンポーネントに渡していくのは少し大変です。
このような場面で使えるのがuseContext
です。
このブログ記事では、useContext
とは何か、どうやって使うのか、
そして実際にReactアプリに組み込む方法を、初心者の方でもわかりやすいように解説します。
useContextとは?どんなときに使う?
Contextとは?リアルな例でイメージしよう
ReactのuseContext
は、コンポーネントの「情報共有」を楽にするための仕組みです。
イメージとしては「家族共有のノート」のようなもの。
たとえば、家族が共通で使う情報(誕生日やアレルギーなどのメモ)を一冊のノートにまとめ、
それを家族全員が確認できると便利ですよね。
ReactのuseContext
も似たような役割を持ち、親子関係に関わらず、
コンポーネント全体でデータを共有できるようにします。
通常、コンポーネント間でデータを共有するためにはprops
でデータを親から子へ渡しますが、
複数の階層にわたるとコードが煩雑になってしまいます。
useContext
を使うと、この「コンポーネントツリー全体で情報を簡単に共有する」ことが可能になります。
useContextの仕組み
useContext
を使うためには、まず「Context」という「情報の箱」を作ります。
この箱に共通で使いたいデータを入れておき、各コンポーネントがuseContext
を使ってその情報を取得します。
こうすることで、propsを渡さずに、どのコンポーネントからも直接そのデータにアクセスできます。
useContextの基本的な使い方
ここでは、ReactでuseContext
を使うための手順を見ていきます。
1. Contextを作成する
まずはReactのcreateContext
関数を使ってContextを作ります。
このContextには、コンポーネント間で共有したいデータを入れることができます。
import React, { createContext } from 'react';
// コンテキストを作成(例: テーマ用)
const ThemeContext = createContext('light');
JSXここで作成したThemeContext
には、デフォルトで'light'
というテーマが入っています。
これにより、ThemeContext
にアクセスしたコンポーネントは、
デフォルトで'light'
の情報を受け取れます。
2. Contextに値を提供する
次に、ThemeContext.Provider
を使って、子コンポーネントに情報を渡します。
Provider
はContextの「配達係」のようなもので、
このタグで囲まれたすべてのコンポーネントがThemeContext
にアクセスできるようになります。
import React from 'react';
import { ThemeContext } from './ThemeContext';
function App() {
return (
<ThemeContext.Provider value="dark">
<ChildComponent />
</ThemeContext.Provider>
);
}
function ChildComponent() {
return <GrandChildComponent />;
}
JSXここでThemeContext.Provider
のvalue
に"dark"
を設定すると、
このProvider
で囲まれたすべてのコンポーネントが
ThemeContext
を使って"dark"
という情報を取得できます。
3. useContextでContextの値を取得する
最後に、useContext
を使ってContextに入っている値を取得します。
これによって、どのコンポーネントでもThemeContext
の値にアクセスできます。
import React, { useContext } from 'react';
import { ThemeContext } from './ThemeContext';
function GrandChildComponent() {
const theme = useContext(ThemeContext);
return (
<div style={{ background: theme === 'dark' ? '#333' : '#fff', color: theme === 'dark' ? '#fff' : '#000' }}>
現在のテーマは{theme}です
</div>
);
}
JSXこの例では、useContext(ThemeContext)
を使ってThemeContext
の値を取得し、
theme
変数に入れています。
このtheme
の値に応じて背景色と文字色を変えています。
useContextを使うときの注意点
1. Contextはあまり多用しない
useContext
はとても便利ですが、むやみに多用するとコードが複雑になることもあります。
Contextは「アプリ全体で共通して使う必要があるデータ」に限定して使うようにしましょう。
特に大規模なアプリケーションでは、
Contextが増えすぎると管理が大変になるため、
Reduxなどの状態管理ツールと組み合わせることも検討してください。
2. Contextの更新が全体に影響することを意識する
Contextの値が更新されると、
そのContextを使っているすべてのコンポーネントが再レンダリングされます。
もし頻繁に更新が必要なデータをContextで管理している場合、
パフォーマンスに影響を与える可能性があるため注意が必要です。
3. 値のプロバイダを入れ子にしない
異なるContextを同時に使いたい場合、Providerを入れ子にすることがよくありますが、
入れ子が増えるとコードが読みづらくなるため、設計の工夫が必要です。
useContextを活用した具体例:ダークモード切り替えアプリ
ここでは、実際にダークモードとライトモードを切り替えられる簡単なアプリを作成してみます。
1. Contextの作成
まずは、テーマの値を管理するThemeContext
を作成します。
import React, { createContext, useState } from 'react';
export const ThemeContext = createContext();
export const ThemeProvider = ({ children }) => {
const [theme, setTheme] = useState('light');
const toggleTheme = () => {
setTheme((prevTheme) => (prevTheme === 'light' ? 'dark' : 'light'));
};
return (
<ThemeContext.Provider value={{ theme, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
};
JSX2. App
コンポーネントでの使用
次に、このThemeProvider
でアプリ全体を囲みます。
import React from 'react';
import { ThemeProvider } from './ThemeContext';
import MainComponent from './MainComponent';
function App() {
return (
<ThemeProvider>
<MainComponent />
</ThemeProvider>
);
}
export default App;
JSX3. useContextでテーマを取得・切り替え
最後に、MainComponent
でuseContext
を使い、テーマの取得や切り替えを行います。
import React, { useContext } from 'react';
import { ThemeContext } from './ThemeContext';
function MainComponent() {
const { theme, toggleTheme } = useContext(ThemeContext);
return (
<div style={{ background: theme === 'dark' ? '#333' : '#fff', color: theme === 'dark' ? '#fff' : '#000' }}>
<p>現在のテーマは{theme}です。</p>
<button onClick={toggleTheme}>テーマを切り替え</button>
</div>
);
}
export default MainComponent;
JSXボタンをクリックするとテーマが切り替わり、MainComponent
の背景色と文字色が変わります。
これで、useContext
を使ってテーマの値を共有し、リアルタイムで変更するアプリが完成しました!
まとめ
useContext
はReactのコンポーネント間で情報を共有するための便利な仕組みです。
props
のバケツリレーを解消し、アプリケーション全体で共通のデータを扱う際に役立ちます。
しかし、過度に多用すると管理が難しくなるため、必要な場面でのみ使うように心がけましょう。
ぜひ、この記事を参考にして、useContext
を活用してみてください!
あざした