useContext()はグローバルな状態を関数コンポーネント内で簡単に取得するためのフックです。
複数のコンポーネント間で共通のデータ(テーマ、ユーザー情報、言語など)を共有したいときに便利です。
使用例1:テーマの切り替え
// ThemeContext.tsx
import { createContext, useState, ReactNode } from 'react';
type Theme = 'light' | 'dark';
export const ThemeContext = createContext<{
theme: Theme;
toggleTheme: () => void;
}>({ theme: 'light', toggleTheme: () => {} });
export const ThemeProvider = ({ children }: { children: ReactNode }) => {
const [theme, setTheme] = useState<Theme>('light');
const toggleTheme = () => setTheme((prev) => (prev === 'light' ? 'dark' : 'light'));
return (
<ThemeContext.Provider value={{ theme, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
};
// App.tsx
import { ThemeProvider } from './ThemeContext';
import Child from './Child';
const App = () => (
<ThemeProvider>
<Child />
</ThemeProvider>
);
// Child.tsx
import { useContext } from 'react';
import { ThemeContext } from './ThemeContext';
const Child = () => {
const { theme, toggleTheme } = useContext(ThemeContext);
return (
<>
<div>テーマ: {theme}</div>
<button onClick={toggleTheme}>テーマ切替</button>
</>
);
};
使用例2: ユーザー認証
AuthContextの作成
// AuthContext.tsx
import { createContext, useState, ReactNode, useContext } from 'react';
type User = {
id: number;
name: string;
};
type AuthContextType = {
user: User | null;
login: (user: User) => void;
logout: () => void;
};
const AuthContext = createContext<AuthContextType>({
user: null,
login: () => {},
logout: () => {},
});
export const AuthProvider = ({ children }: { children: ReactNode }) => {
const [user, setUser] = useState<User | null>(null);
const login = (newUser: User) => setUser(newUser);
const logout = () => setUser(null);
return (
<AuthContext.Provider value={{ user, login, logout }}>
{children}
</AuthContext.Provider>
);
};
// 便利なカスタムフック
export const useAuth = () => useContext(AuthContext);
App全体にProviderを設定
// App.tsx
import { AuthProvider } from './AuthContext';
import Profile from './Profile';
import LoginButton from './LoginButton';
const App = () => (
<AuthProvider>
<h1>認証付きアプリ</h1>
<LoginButton />
<Profile />
</AuthProvider>
);
ログイン・ログアウト操作
// LoginButton.tsx
import { useAuth } from './AuthContext';
const LoginButton = () => {
const { user, login, logout } = useAuth();
const handleLogin = () => {
login({ id: 1, name: 'John Doe' });
};
return user ? (
<button onClick={logout}>ログアウト</button>
) : (
<button onClick={handleLogin}>ログイン</button>
);
};
ユーザー情報の表示
// Profile.tsx
import { useAuth } from './AuthContext';
const Profile = () => {
const { user } = useAuth();
return (
<div>
{user ? (
<p>ようこそ、{user.name} さん</p>
) : (
<p>ログインしてください</p>
)}
</div>
);
};