Jul 13, 2024
Starting Point: Props
Context API Essentials
useContext
.createContext
, Provider
, and value passing.Steps to Implement Context API
createContext
.useContext
hook to access context data within components.Example Code Analysis
UserContext
and UserContextProvider
to manage user state globally.
import { createContext, useState } from 'react';
const UserContext = createContext();
const UserContextProvider = ({ children }) => {
const [user, setUser] = useState(null);
return (
<UserContext.Provider value={{ user, setUser }}>
{children}
</UserContext.Provider>
);
};
export { UserContext, UserContextProvider };
Component Structure
App.jsx
wrapped with UserContextProvider
.Login
and Profile
which consume context data.import { useContext, useState } from 'react';
import { UserContext } from './UserContext';
const Login = () => {
const [username, setUsername] = useState('');
const { setUser } = useContext(UserContext);
const handleSubmit = (event) => {
event.preventDefault();
setUser({ username });
};
return (
<form onSubmit={handleSubmit}>
<input type="text" value={username} onChange={(e) => setUsername(e.target.value)} />
<button type="submit">Login</button>
</form>
);
};
export default Login;
Profile Component
import { useContext } from 'react';
import { UserContext } from './UserContext';
const Profile = () => {
const { user } = useContext(UserContext);
return user ? <div>Welcome, {user.username}</div> : <div>Please login</div>;
};
export default Profile;
Theme Context Setup
import { createContext, useState, useContext } from 'react';
const ThemeContext = createContext();
const ThemeProvider = ({ children }) => {
const [themeMode, setThemeMode] = useState('light');
const toggleTheme = () => {
setThemeMode((prevMode) => (prevMode === 'light' ? 'dark' : 'light'));
};
return (
<ThemeContext.Provider value={{ themeMode, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
};
export { ThemeContext, ThemeProvider };
Theme Application
useEffect
to toggle classes on the HTML element.Theme Button Component
import { useContext } from 'react';
import { ThemeContext } from './ThemeContext';
const ThemeButton = () => {
const { themeMode, toggleTheme } = useContext(ThemeContext);
return (
<button onClick={toggleTheme}>
Switch to {themeMode === 'light' ? 'dark' : 'light'} mode
</button>
);
};
export default ThemeButton;
Tailwind Configuration Adjustment
darkMode: 'class',
Complete Project Structure
ThemeProvider
and components properly.