A comprehensive guide to React Hooks and how to use them effectively.
useState Hook
Manage component state:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import { useState } from 'react';
function Counter() { const [count, setCount] = useState(0);
return ( <div> <p>Count: {count}</p> <button onClick={() => setCount(count + 1)}> Increment </button> <button onClick={() => setCount(count - 1)}> Decrement </button> </div> ); }
|
useEffect Hook
Handle side effects:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| import { useState, useEffect } from 'react';
function UserProfile({ userId }) { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true);
useEffect(() => { async function fetchUser() { setLoading(true); const response = await fetch(`/api/users/${userId}`); const data = await response.json(); setUser(data); setLoading(false); }
fetchUser();
return () => { }; }, [userId]);
if (loading) return <div>Loading...</div>; return <div>{user.name}</div>; }
|
useContext Hook
Access context values:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import { createContext, useContext, useState } from 'react';
const ThemeContext = createContext();
function ThemeProvider({ children }) { const [theme, setTheme] = useState('light');
return ( <ThemeContext.Provider value={{ theme, setTheme }}> {children} </ThemeContext.Provider> ); }
function ThemedButton() { const { theme, setTheme } = useContext(ThemeContext);
return ( <button style={{ background: theme === 'light' ? '#fff' : '#333', color: theme === 'light' ? '#333' : '#fff' }} onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')} > Toggle Theme </button> ); }
|
useReducer Hook
Manage complex state logic:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import { useReducer } from 'react';
const initialState = { count: 0 };
function reducer(state, action) { switch (action.type) { case 'increment': return { count: state.count + 1 }; case 'decrement': return { count: state.count - 1 }; case 'reset': return initialState; default: throw new Error(); } }
function Counter() { const [state, dispatch] = useReducer(reducer, initialState);
return ( <div> <p>Count: {state.count}</p> <button onClick={() => dispatch({ type: 'increment' })}>+</button> <button onClick={() => dispatch({ type: 'decrement' })}>-</button> <button onClick={() => dispatch({ type: 'reset' })}>Reset</button> </div> ); }
|
Custom Hooks
Create reusable logic:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| import { useState, useEffect } from 'react';
function useLocalStorage(key, initialValue) { const [value, setValue] = useState(() => { const stored = localStorage.getItem(key); return stored ? JSON.parse(stored) : initialValue; });
useEffect(() => { localStorage.setItem(key, JSON.stringify(value)); }, [key, value]);
return [value, setValue]; }
function App() { const [name, setName] = useLocalStorage('name', '');
return ( <input value={name} onChange={(e) => setName(e.target.value)} placeholder="Enter your name" /> ); }
|
Hooks make React components more powerful and easier to understand!