DEV Community

Cover image for Demystifying React Memoization: Understanding React.memo() and the useMemo hook
Nils Whitmont
Nils Whitmont

Posted on

Demystifying React Memoization: Understanding React.memo() and the useMemo hook

Introduction

Ever feel like your React components are re-rendering unnecessarily, dragging down performance? Fret no more! React offers two powerful tools for memoization: React.memo() and the useMemo hook. But which one should you use, and when? Let's break it down:

React.memo()

Remember: React.memo wraps a Component

  • What it is: A higher-order component (HOC) that wraps your functional components.
  • What it does: Prevents unnecessary re-renders by comparing prop changes. If props haven't changed, the component skips re-rendering, improving performance.
  • Use it for: Components that are expensive to render due to complex UI or data manipulation, but where props rarely change.
  • Example:
import memo from 'react';

const MyExpensiveComponent = memo(({ data }) => {
  // Do something expensive with data
  return (
    <div>
      {/* Render content based on data */}
    </div>
  );
});
Enter fullscreen mode Exit fullscreen mode

useMemo Hook

Remember: The useMemo hook wraps a function

  • What it is: A React hook that memoizes the result of a function.
  • What it does: Caches the function's output and only re-executes it if the function's dependencies (passed as an array) change.
  • Use it for: Expensive calculations or derived values within a component that don't need to be recalculated every render if their dependencies haven't changed.
  • Example:
export const ExampleComponent = () => {
  const expensiveValue = useMemo(() => {
    // Do some expensive calculation
    return result;
  }, [dependency1, dependency2]);

  return (
    <div>
      {/* Use expensiveValue */}
    </div>
  );
};
Enter fullscreen mode Exit fullscreen mode

What is an "expensive" function?

In the context of React memoization, an "expensive function" refers to a function that:

  • Consumes significant computational resources: This could involve complex calculations, data processing, extensive DOM manipulations, or API calls that take time to complete.
  • Has the potential to slow down rendering: When such functions are executed frequently, often during re-renders, they can create noticeable delays in the user experience, affecting UI responsiveness and overall performance.

Examples of expensive functions in React components:

  • Sorting or filtering large datasets: Ordering a massive list of items or applying complex filters can be computationally intensive.
  • Performing complex calculations: Functions that involve heavy mathematical computations or data transformations can be costly.
  • Fetching data from external APIs: Making network requests to retrieve data from servers can introduce delays, especially if the API responses are large or slow.
  • Rendering complex UI elements: Generating intricate UI structures with many nested components or extensive styling calculations can also be expensive.

The goal of memoization techniques like React.memo and useMemo is to minimize the number of times these expensive functions are executed, thereby optimizing performance and ensuring a smoother user experience.

What's the Difference?

  • React.memo targets entire component re-renders, while useMemo memoizes individual function results.
  • React.memo compares prop changes, while useMemo relies on a dependency array.

When to Use Memoization

  • If you're dealing with expensive component rendering due to prop changes, use React.memo.
  • If you have expensive calculations or derived values within a component, use useMemo.

Remember, memoization is a powerful technique for optimizing performance, but use it judiciously. Over-memoization can add complexity and decrease readability.

Bonus Tip: Profile your React app to identify performance bottlenecks before applying memoization.

I hope this post clarifies the differences between React.memo and useMemo. Feel free to share your experiences with memoization in the comments!

Top comments (3)

Collapse
 
_ndeyefatoudiop profile image
Ndeye Fatou Diop

Very nice post : clear and concise. One other use case of React.useMemo is that if you have a component wrapped with React.memo, you also need to make sure the props are memoized: so you may need to use React.useMemo in the parent component. Otherwise it serves no purpose. Just wrote about this mistake here => dev.to/_ndeyefatoudiop/5-small-yet... 😅

Collapse
 
brense profile image
Rense Bakker

useMemo primary use is to prevent passing new values as props to child components on each rerender, which leads to bugs and bad performance if any component down the tree has a useEffect that depends on one of those dirty props.

Collapse
 
darshan10 profile image
Darshan Pandya

Thank you for the brief explanation ☺️. Now I'll not get confused while using them.