dev Await
February 2025
Understanding useCallback and useMemo
Introduction
useCallback and useMemo are React hooks used for performance optimization. They help prevent unnecessary re-renders of components by memoizing values and functions.
useCallback 🔄
What is useCallback?
useCallback is a hook that returns a memoized version of a callback function that only changes if one of its dependencies changes.
When to Use?
- When passing callbacks to optimized child components that rely on reference equality 
- To prevent unnecessary re-renders in child components 
- When working with complex event handlers 
Basic Example:
import React, { useCallback, useState } from 'react';
const ParentComponent = () => {
  const [count, setCount] = useState(0);
  // Without useCallback - function recreated on every render
  const handleClick = () => {
    setCount(count + 1);
  };
  // With useCallback - function memoized
  const handleClickMemoized = useCallback(() => {
    setCount(prevCount => prevCount + 1);
  }, []); // Empty dependency array as it uses functional update
  return (
    <div>
      <p>Count: {count}</p>
      <ChildComponent onPress={handleClickMemoized} />
    </div>
  );
};
const ChildComponent = React.memo(({ onPress }) => {
  console.log("Child rendered");
  return <button onClick={onPress}>Add</button>;
});useMemo 📝
What is useMemo?
useMemo is a hook that returns a memoized value. It only recomputes the value when one of the dependencies changes.
When to Use?
- For expensive calculations 
- When dealing with complex data transformations 
- To prevent unnecessary re-computations 
Basic Example:
import React, { useMemo, useState } from 'react';
const ExpensiveComponent = () => {
  const [numbers] = useState([1, 2, 3, 4, 5]);
  const [count, setCount] = useState(0);
  // Without useMemo - calculated on every render
  const sum = numbers.reduce((acc, num) => acc + num, 0);
  // With useMemo - only calculated when numbers change
  const memoizedSum = useMemo(() => {
    return numbers.reduce((acc, num) => acc + num, 0);
  }, [numbers]);
  return (
    <div>
      <p>Sum: {memoizedSum}</p>
      <button onClick={() => setCount(count + 1)}>
        Click count: {count}
      </button>
    </div>
  );
};Key Differences 🔍
- Purpose - useCallback: Memoizes functions 
- useMemo: Memoizes values 
 
- Usage - // useCallback const memoizedFn = useCallback(() => { doSomething(a, b); }, [a, b]); // useMemo const memoizedValue = useMemo(() => { return computeExpensiveValue(a, b); }, [a, b]);
Best Practices 💡
- Don't Overuse - Only use when there's a clear performance benefit 
- Profile your app to identify actual performance issues 
 
- Proper Dependencies - // Good const memoizedValue = useMemo(() => { return expensiveOperation(prop); }, [prop]); // Bad - missing dependency const memoizedValue = useMemo(() => { return expensiveOperation(prop); }, []); // ESLint will warn about this
- Use with React.memo - const ChildComponent = React.memo(({ callback }) => { return <button onClick={callback}>Click me</button>; }); const ParentComponent = () => { const callback = useCallback(() => { // handle click }, []); return <ChildComponent callback={callback} />; };
When Not to Use 🚫
- Simple calculations 
- Components that always need to re-render 
- When there's no clear performance benefit 
That's the essential guide to useCallback and useMemo! Remember to use them only when necessary for performance optimization. Happy coding! 🚀
