Memoization in React is an optimization technique used to prevent unnecessary re-renders of components or re-calculations of expensive values. It works by caching the result of a function or component based on its inputs (props or dependencies) and returning the cached result if the inputs haven't changed.
1. Memoizing Components with React.memo:
React.memo is a higher-order component (HOC) used to memoize functional components. It prevents the component from re-rendering if its props have not changed.
import React from 'react';
const MyMemoizedComponent = React.memo(({ prop1, prop2 }) => {
// This component will only re-render if prop1 or prop2 change
return (
<div>
<p>Prop 1: {prop1}</p>
<p>Prop 2: {prop2}</p>
</div>
);
});
2. Memoizing Values with useMemo:
The useMemo hook is used to memoize the result of an expensive calculation. The calculation will only be re-executed if its dependencies change.
import React, { useMemo } from 'react';
function MyComponent({ data }) {
const expensiveValue = useMemo(() => {
// Perform an expensive calculation using 'data'
return data.map(item => item * 2);
}, [data]); // Re-calculate only when 'data' changes
return (
<div>
{/* Render expensiveValue */}
</div>
);
}
3. Memoizing Callbacks with useCallback:
The useCallback hook is used to memoize a function, preventing it from being re-created on every render. This is particularly useful when passing callbacks as props to memoized child components to avoid unnecessary re-renders of the child.
import React, { useCallback } from 'react';
function ParentComponent() {
const handleClick = useCallback(() => {
console.log('Button clicked!');
}, []); // The function will not be re-created unless dependencies change
return <ChildComponent onClick={handleClick} />;
}
const ChildComponent = React.memo(({ onClick }) => {
return <button onClick={onClick}>Click Me</button>;
});
When to Use Memoization:
Expensive calculations:
Memoize the results of computations that are time-consuming or resource-intensive.
Preventing unnecessary re-renders:
Use React.memo for components that receive stable props and whose re-renders are costly.
Optimizing callback functions:
Use useCallback when passing functions as props to memoized child components.
Top comments (0)