Table of contents
In this article, we will learn about useMemo Hook
It works similarly to the useCallback hook
The React
useMemo
Hook returns a memoized value.
What is useMemo hook?
useMemo()
is a built-in React hook that accepts ✌️two arguments — a function
and the dependencies array
:
const memoizedResult = useMemo(compute, dependencies);
The function provided to useMemo
is only re-evaluated if any of the dependencies in the dependencies array have changed. If the dependencies have not changed, the previously memoized value is returned without re-computing the function.
The syntax for using useMemo
is as follows:
import React, { useMemo } from 'react';
const Component = () => {
const memoizedValue = useMemo(() => {
// computation or expensive operation
return someValue;
}, [dependency1, dependency2]);
// Rest of the component logic
return (
// JSX rendering using the memoized value
);
};
Here's an example to illustrate the usage of useMemo
:
import React, { useState, useMemo } from 'react';
const Counter = () => {
const [count, setCount] = useState(0);
const doubleCount = useMemo(() => {
console.log('Computing double count...');
return count * 2;
}, [count]);
const increment = () => {
setCount(count + 1);
};
return (
<div>
<p>Count: {count}</p>
<p>Double Count: {doubleCount}</p>
<button onClick={increment}>Increment</button>
</div>
);
};
In the above example, we have a Counter
component that uses the useMemo
Hook. The doubleCount
variable is memoized using useMemo
. It computes the double of the count
value but will only recompute if the count
value changes.
Whenever the increment
button is clicked, the count
state is updated using the setCount
function, triggering a re-render of the component. However, the doubleCount
value is memoized, and it will not be re-computed if the count
value remains the same. This helps to optimize the performance of the component by avoiding unnecessary re-computations.
You can use useMemo
in scenarios where you have expensive calculations or computations that depend on certain values but don't need to be recomputed on every render. By memoizing the value, you can ensure that the computation is only performed when necessary, reducing unnecessary work and improving the performance of your React components.
Let's take another example:
import { useState, useMemo } from "react";
import ReactDOM from "react-dom/client";
const App = () => {
const [count, setCount] = useState(0);
const [todos, setTodos] = useState([]);
const calculation = useMemo(() => expensiveCalculation(count), [count]);
const increment = () => {
setCount((c) => c + 1);
};
const addTodo = () => {
setTodos((t) => [...t, "New Todo"]);
};
return (
<div>
<div>
<h2>My Todos</h2>
{todos.map((todo, index) => {
return <p key={index}>{todo}</p>;
})}
<button onClick={addTodo}>Add Todo</button>
</div>
<hr />
<div>
Count: {count}
<button onClick={increment}>+</button>
<h2>Expensive Calculation</h2>
{calculation}
</div>
</div>
);
};
In this example, the useMemo
hook is used to memoize the result of the expensiveCalculation
function based on the count
state. Whenever the count
state changes, the expensiveCalculation
function is re-evaluated, and the memoized result is stored in the calculation
variable.
The component has two state variables: count
and todos
. The count
state is incremented when the "+" button is clicked, and the todos
state is updated when the "Add Todo" button is clicked.
The expensiveCalculation
function represents a computationally expensive operation that takes the count
as input. It performs a loop for a large number of iterations, simulating a time-consuming calculation. By using useMemo
, the result of this calculation is memoized and only re-computed when the count
state changes.
The rendered JSX displays a list of todos, an "Add Todo" button, the current count
, an increment button, and the result of the calculation
. Whenever the count
state changes, the calculation
is re-evaluated and displayed.
Overall, useMemo
optimizes the performance of the component by avoiding unnecessary re-evaluations of the expensive calculation when the dependencies don't change, resulting in a smoother user experience.
Summary
The useMemo
Hook is a built-in hook in React that allows you to memoize the result of a computation and cache it for future use.
The useMemo
Hook only runs when one of its dependencies update.This can improve performance.
The useMemo
and useCallback
Hooks are similar. The main difference is that useMemo
returns a memoized value and useCallback
returns a memoized function
To fix this performance issue, we can use the useMemo
Hook to memoize the expensiveCalculation
function. This will cause the function to only run when needed.We can wrap the expensive function call with useMemo
.
The useMemo
Hook accepts a second parameter to declare dependencies. The expensive function will only run when its dependencies have changed.