As your React application scales, unnecessary re-renders can hurt performance. React's built-in React.memo
and custom comparison functions allow you to fine-tune rendering behavior. In this guide, we'll explore how to use memoization efficiently in real-world scenarios, especially with complex props.
1. React.memo Basics
React.memo
is a higher-order component that prevents re-renders when props haven't changed:
const Greeting = React.memo(function Greeting({ name }) { console.log("Rendered Greeting"); return <p>Hello, {name}!</p>; });
If the parent component re-renders but the name
prop is unchanged, Greeting
won’t re-render.
2. Custom Comparison Functions
When props are complex (e.g., objects or arrays), React compares them by reference. You can provide your own comparison function:
const ExpensiveComponent = React.memo(function ExpensiveComponent({ data }) { return <div>{data.title}</div>; }, (prevProps, nextProps) => { return prevProps.data.id === nextProps.data.id; });
This ensures re-renders only occur when necessary—even if the object reference changes but its relevant data hasn’t.
3. Memoizing Callbacks With useCallback
Passing inline functions as props can also trigger re-renders. Use useCallback
to memoize them:
const handleClick = useCallback(() => { console.log("Clicked"); }, []);
4. Memoizing Values With useMemo
To avoid recalculating expensive operations:
const sortedData = useMemo(() => { return data.sort((a, b) => a.value - b.value); }, [data]);
5. When Not to Memoize
- Components that render infrequently or are lightweight don’t benefit from memoization.
- Overusing memo can lead to more complex and harder-to-maintain code.
Pros & Cons of Memoization in React
- ✅ Pros:
- Reduces unnecessary rendering of child components
- Improves performance in list-heavy UIs
- Fine-grained control via custom comparison functions
- ⚠️ Cons:
- Can increase memory usage due to retained closures
- Requires careful tracking of dependencies
- Added complexity if overused
Alternatives
- Virtualization (e.g., react-window) for huge lists
- Context selectors for slicing data at consumption points
- State colocation to reduce prop drilling and renders
Conclusion
Memoization is a powerful tool for performance-sensitive React apps. When used strategically, React.memo
, useCallback
, and useMemo
can significantly reduce re-renders without sacrificing readability.
For a much more extensive guide on getting the most out of React portals, check out my full 24-page PDF file on Gumroad. It's available for just $10:
Using React Portals Like a Pro.
If this post helped you, consider supporting me: buymeacoffee.com/hexshift
Top comments (0)