âïž React Hooks â A Quick Guide
React Hooks are functions that let you “hook into” React state and lifecycle features from function components. Introduced in React 16.8, Hooks eliminate the need for class components for most use cases.
đ§ Why Use Hooks?
Reuse logic across components (via custom hooks)
Simplify component structure (no classes)
Cleaner and more readable state management
Easily manage side effects
đŠ Built-in React Hooks
Hook | Purpose |
---|---|
useState | Manage local state |
useEffect | Handle side effects (e.g., fetch, subscriptions) |
useContext | Consume React Context |
useRef | Persist mutable values without re-rendering |
useMemo | Optimize performance with memoized values |
useCallback | Memoize functions to prevent unnecessary renders |
useReducer | State logic with reducers (like Redux) |
useLayoutEffect | Similar to useEffect but fires synchronously |
useImperativeHandle | Customize the instance value exposed by ref |
useId , useTransition , useDeferredValue | Advanced, concurrent mode-specific hooks (React 18+) |
đ ïž Examples of Popular Hooks
đą 1. useState
const [count, setCount] = useState(0);
<button onClick={() => setCount(count + 1)}>Click {count}</button>
đĄ 2. useEffect
useEffect(() => {
document.title = `Count: ${count}`;
}, [count]); // Only runs when `count` changes
đ” 3. useContext
const ThemeContext = React.createContext('light');
function App() {
const theme = useContext(ThemeContext);
return <div className={theme}>Hello!</div>;
}
đŽ 4. useRef
const inputRef = useRef(null);
useEffect(() => {
inputRef.current.focus();
}, []);
<input ref={inputRef} />
đŁ 5. useReducer
(good for complex state)
const reducer = (state, action) => {
switch (action.type) {
case 'increment': return { count: state.count + 1 };
default: return state;
}
};
const [state, dispatch] = useReducer(reducer, { count: 0 });
<button onClick={() => dispatch({ type: ‘increment’ })}>
Count: {state.count}
</button>
đ§ Custom Hook Example
Create reusable logic:
function useLocalStorage(key, initialValue) {
const [value, setValue] = useState(() =>
JSON.parse(localStorage.getItem(key)) || initialValue
);
useEffect(() => {
localStorage.setItem(key, JSON.stringify(value));
}, [key, value]);
return [value, setValue];
}
Use it like:
const [theme, setTheme] = useLocalStorage('theme', 'dark');
đ§Ș Tips & Gotchas
Never use Hooks conditionally (must always run in the same order)
Custom hooks are just functions that use other hooks
useEffect()
replacescomponentDidMount
,componentDidUpdate
,componentWillUnmount
Donât mutate state directly â always use
setState
/dispatch
đ Resources to Learn Hooks
đ useHooks.dev â Ready-made custom hooks