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.