ReactのuseContextでできること
ReactのuseContextフックは、Reactアプリケーションでグローバルな状態管理やテーマの切り替えなどに非常に役立ちます。
具体的には、次のようなことができます:
1. グローバルな状態管理:
useContextを使用して、複数のコンポーネントで同じデータを共有できます。
例えば、ログイン状態や言語設定などの情報を、Contextを介してどのコンポーネントからでもアクセス可能にします。
// Example of using useContext for global state management import React, { useContext } from 'react'; // Create a context const UserContext = React.createContext(); // Provider component function UserProvider({ children }) { const [user, setUser] = useState(null); return ( <UserContext.Provider value={{ user, setUser }}> {children} </UserContext.Provider> ); } // Child component consuming the context function UserProfile() { const { user } = useContext(UserContext); return ( <div> {user ? ( <p>Welcome, {user.name}!</p> ) : ( <p>Please log in.</p> )} </div> ); }
2. テーマの切り替え:
useContextを使って、アプリケーション全体のテーマを切り替えることができます。
例えば、ライトモードとダークモードをユーザーが選択できるようにする場合に役立ちます。
// Example of using useContext for theme switching import React, { useContext } from 'react'; const ThemeContext = React.createContext(); function ThemeProvider({ children }) { const [theme, setTheme] = useState('light'); const toggleTheme = () => { setTheme(prevTheme => (prevTheme === 'light' ? 'dark' : 'light')); }; return ( <ThemeContext.Provider value={{ theme, toggleTheme }}> {children} </ThemeContext.Provider> ); } function ThemeSwitcher() { const { theme, toggleTheme } = useContext(ThemeContext); return ( <button onClick={toggleTheme}> Switch to {theme === 'light' ? 'dark' : 'light'} mode </button> ); }
3. 複数のContextの使用:
複数のuseContextフックを組み合わせて、異なるコンテキストから情報を取得することも可能です。
ThemeProvider
// ThemeContext.js import React, { createContext, useState } from 'react'; 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> ); }; export default ThemeContext;
UserProvider
// UserContext.js import React, { createContext, useState } from 'react'; const UserContext = createContext(); export const UserProvider = ({ children }) => { const [user, setUser] = useState(null); return ( <UserContext.Provider value={{ user, setUser }}> {children} </UserContext.Provider> ); }; export default UserContext;
AppコンポーネントでそれぞれのProviderを使って状態を管理します。
import React from 'react'; import { ThemeProvider } from './ThemeContext'; import { UserProvider } from './UserContext'; import UserProfile from './UserProfile'; import ThemeSwitcher from './ThemeSwitcher'; const App = () => { return ( <ThemeProvider> <UserProvider> <div> <h1>My App</h1> <UserProfile /> <ThemeSwitcher /> </div> </UserProvider> </ThemeProvider> ); }; export default App;
各コンポーネントで必要なコンテキストをuseContextフックを使って取得し、それに基づいてContextを更新。
// ThemeSwitcher.js import React, { useContext } from 'react'; import ThemeContext from './ThemeContext'; const ThemeSwitcher = () => { const { theme, toggleTheme } = useContext(ThemeContext); return ( <button onClick={toggleTheme}> Switch to {theme === 'light' ? 'dark' : 'light'} mode </button> ); }; export default ThemeSwitcher;
// UserProfile.js import React, { useContext } from 'react'; import UserContext from './UserContext'; const UserProfile = () => { const { user } = useContext(UserContext); return ( <div> {user ? ( <p>Welcome, {user.name}!</p> ) : ( <p>Please log in.</p> )} </div> ); }; export default UserProfile;
このようにすることで、Appコンポーネントで複数のProviderを使用し、それぞれのコンポーネントで必要な状態を管理できます。
各コンポーネントは必要なコンテキストをuseContextを使って直接取得し、その状態に基づいてUIを更新することができます。
useContextは、特定のコンテキストを介してコンポーネント間でデータを効率的に共有する方法を提供するため、大規模なアプリケーション開発で特に強力です。