React useCallback Hook β Memoizing Functions in React (2025 Guide)
Introduction β Why Use useCallback?
In React.js, when a component re-renders, functions defined inside it get recreated on every render. This can cause unnecessary re-renders in child componentsβespecially if those functions are passed as props.
The useCallback hook helps memoize function references, so they donβt change across renders unless their dependencies change.
In this guide, youβll learn:
- What
useCallbackis and how it works - When to use it (and when not to)
- Common examples like callbacks, event handlers, and child props
- Best practices for cleaner and faster React apps
What is the useCallback Hook?
useCallback returns a memoized version of a callback function, preventing unnecessary re-creation unless dependencies change.
Syntax:
const memoizedCallback = useCallback(() => {
// function body
}, [dependencies]);
It’s mainly used to avoid re-passing new function references to memoized child components.
1. Why Do Functions Re-render?
Every render creates a new function identity:
const handleClick = () => console.log('clicked'); // new function every render
Even though the logic hasnβt changed, React sees a new function, which can cause child components to re-render unnecessarily.
2. useCallback Example β Prevent Unnecessary Re-renders
import { useCallback, useState } from 'react';
const Child = React.memo(({ onClick }) => {
console.log('Child re-rendered');
return <button onClick={onClick}>Click Me</button>;
});
function Parent() {
const [count, setCount] = useState(0);
const handleClick = useCallback(() => {
console.log('Clicked!');
}, []); // no re-creation unless dependencies change
return (
<>
<Child onClick={handleClick} />
<button onClick={() => setCount(c => c + 1)}>Increment</button>
</>
);
}
Without useCallback, Child would re-render every time Parent does
3. useCallback vs useMemo
| Hook | Returns | Use Case |
|---|---|---|
useCallback | Memoized function | Prevent re-creating functions |
useMemo | Memoized value | Prevent recalculating expensive values |
Use useCallback when passing functions to memoized children or useEffect.
4. useCallback for Event Handlers and API Calls
const handleSubmit = useCallback(() => {
// submit form
}, [formData]);
Prevents handleSubmit from re-creating unless formData changes
5. Common Pitfalls
| Mistake | Fix |
|---|---|
| Missing dependencies | Always include all external dependencies |
| Overusing for simple functions | Only use if identity matters (e.g., props, effects) |
Confusing with useMemo | Remember: useCallback returns functions |
Best Practices
Use useCallback when:
- Passing callbacks to memoized child components
- Preventing effect re-runs due to function identity
- Memoizing handlers in performance-sensitive components
Avoid wrapping every function in useCallback β it’s not free (adds memory/logic overhead)
6. useCallback with Custom Hooks
You can return memoized functions from custom hooks:
function useToggle(initial = false) {
const [state, setState] = useState(initial);
const toggle = useCallback(() => setState(prev => !prev), []);
return [state, toggle];
}
Makes your custom hooks more efficient and reusable
Summary β Recap & Next Steps
Reactβs useCallback hook helps you memoize function references to avoid unnecessary re-renders β especially in combination with React.memo or useEffect.
Key Takeaways:
useCallbackreturns a stable reference to a function- Prevents re-renders when function is passed as a prop
- Use with
React.memo()to optimize child components - Be mindful of dependencies
- Avoid over-optimization for simple cases
Real-World Relevance:useCallback powers optimizations in dashboards, infinite scroll lists, data grids, and any app with frequent re-renders and complex component trees.
FAQ Section
When should I use useCallback in React?
Use it when a function is passed to a memoized child or used in useEffect dependencies.
What is the difference between useMemo and useCallback?
useMemo returns a memoized value, while useCallback returns a memoized function.
Does useCallback prevent all re-renders?
No. It prevents re-creation of functions, which helps avoid unnecessary child re-renders when used with React.memo.
Should I wrap every function with useCallback?
No. Only wrap functions that need stable references for performance-sensitive parts of your app.
Can I use useCallback inside useEffect?
Yes. And itβs especially useful to prevent unnecessary effect re-triggers due to function identity.
Share Now :
