LOADING
PLEASE WAIT...
BACK TO LORE
Tutorials

Advanced React Hooks: useCallback and useMemo

👤 Motaz📅 January 10, 20246 min read

Deep dive into React performance optimization using useCallback and useMemo hooks with practical examples.

Advanced React Hooks: useCallback and useMemo


Performance optimization in React applications is crucial for creating smooth user experiences. Two of the most powerful hooks for optimization are `useCallback` and `useMemo`.


Understanding useCallback


The `useCallback` hook returns a memoized callback function that only changes if one of its dependencies has changed.


javascript
"color: #569cd6">import React, { useState, useCallback } "color: #569cd6">from 'react';

"color: #569cd6">const ExpensiveComponent = ({ onButtonClick }) => {
  console.log('ExpensiveComponent rendered');
  
  "color: #569cd6">return (
    
  );
};

"color: #569cd6">const ParentComponent = () => {
  "color: #569cd6">const [count, setCount] = useState(0);
  "color: #569cd6">const [name, setName] = useState('');

  // Without useCallback - creates "color: #569cd6">new "color: #569cd6">function on every render
  "color: #569cd6">const handleClick = () => {
    console.log('Button clicked!');
  };

  // With useCallback - memoized "color: #569cd6">function
  "color: #569cd6">const memoizedHandleClick = useCallback(() => {
    console.log('Button clicked!');
  }, []); // Empty dependency array

  "color: #569cd6">return (
    
setName(e.target.value)} placeholder="Enter name" />

Count: {count}

); };

Understanding useMemo


The `useMemo` hook returns a memoized value that only recalculates when its dependencies change.


javascript
"color: #569cd6">import React, { useState, useMemo } "color: #569cd6">from 'react';

"color: #569cd6">const ExpensiveCalculation = ({ items }) => {
  "color: #569cd6">const [filter, setFilter] = useState('');

  // Without useMemo - recalculates on every render
  "color: #569cd6">const expensiveValue = items
    .filter(item => item.name.includes(filter))
    .reduce((sum, item) => sum + item.value, 0);

  // With useMemo - only recalculates when dependencies change
  "color: #569cd6">const memoizedExpensiveValue = useMemo(() => {
    console.log('Calculating expensive value...');
    "color: #569cd6">return items
      .filter(item => item.name.includes(filter))
      .reduce((sum, item) => sum + item.value, 0);
  }, [items, filter]);

  "color: #569cd6">return (
    
setFilter(e.target.value)} placeholder="Filter items" />

Total Value: {memoizedExpensiveValue}

); };

Best Practices


1. **Don't overuse these hooks** - They have their own overhead

2. **Profile before optimizing** - Use React DevTools Profiler

3. **Consider the dependency array carefully** - Missing dependencies can cause bugs


javascript
// Bad - missing dependency
"color: #569cd6">const memoizedValue = useMemo(() => {
  "color: #569cd6">return expensiveCalculation(a, b);
}, [a]); // Missing 'b' in dependencies

// Good - all dependencies included
"color: #569cd6">const memoizedValue = useMemo(() => {
  "color: #569cd6">return expensiveCalculation(a, b);
}, [a, b]);

Conclusion


Both `useCallback` and `useMemo` are powerful tools for React optimization, but they should be used judiciously. Always measure performance before and after optimization to ensure you're actually improving your application's performance.

QUEST TAGS:

#React#Hooks#Performance#JavaScript
Advanced React Hooks: useCallback and useMemo | Overworld Lore