Table of contents
In React, memoization is the process of optimizing performance by caching the result of expensive function calls and reusing them when the inputs to the function have not changed. React provides two memoization hooks - useCallback
and useMemo
- which can help optimize the rendering process by reducing unnecessary computations.
useCallback
useCallback
is a hook that allows you to memoize a function so that it is only recreated when one of its dependencies changes. This can be useful when you have a component that relies on a function that is expensive to create or that has a lot of dependencies.
Here's an example of how to use useCallback
:
import { useCallback, useState } from 'react';
import ChildComponent from './ChildComponent';
function ParentComponent() {
const [count, setCount] = useState(0);
const handleClick = useCallback(() => {
setCount(prevCount => prevCount + 1);
}, []);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={handleClick}>Click me</button>
<ChildComponent onClick={handleClick} />
</div>
);
}
In this example, we define a ParentComponent
that renders a ChildComponent
and passes it a function prop called onClick
. The onClick
function is created using the useCallback
hook, which memoizes it so that it only changes when one of its dependencies changes.
Because the onClick
function is memoized, the ChildComponent
only re-renders when the count
state changes (which is the only dependency of the onClick
function), even if the ParentComponent
re-renders for other reasons.
This can be a useful optimization in cases where the child component renders frequently, and the parent component updates often for reasons other than the onClick
prop. By memoizing the onClick
function with useCallback
, we can avoid unnecessary re-renders of the child component and improve performance.
useMemo
useMemo
is a hook that allows you to memoize the result of a function so that it is only recomputed when one of its dependencies changes. This can be useful when you have a component that relies on a function that is expensive to compute or that has a lot of dependencies.
Here's an example of how to use useMemo
:
import { useMemo, useState } from 'react';
function MyComponent() {
const [count, setCount] = useState(0);
const factorial = useMemo(() => {
let result = 1;
for (let i = 1; i <= count; i++) {
result *= i;
}
return result;
}, [count]);
return (
<div>
<p>The factorial of {count} is {factorial}</p>
<button onClick={() => setCount(count + 1)}>Calculate factorial</button>
</div>
);
}
In this example, the factorial
value is only recomputed when the count
state changes, which means that the expensive computation of the factorial is not performed unnecessarily on every render.
Conclusion
Memoization is an important technique for optimizing performance in React applications, and useCallback
and useMemo
hooks are powerful tools for implementing memoization. By using these hooks, you can reduce the amount of unnecessary computation that your application performs, which can lead to faster rendering and better overall performance.
The next and final article in this series will cover Custom Hooks. Custom Hooks are a powerful way to reuse logic and stateful behavior across multiple components in a React application. They allow developers to extract common functionality into reusable, composable functions that can be easily shared and composed.