React's performance can significantly improve by ensuring components do not re-render unnecessarily. One notable way to optimize performance for frequently re-rendered lists of items in React is through the React.memo
function.
React.memo
is a higher-order function introduced in the React 16.6 version. It's an advanced optimization technique that memoizes the output of a function – in this case, an output of a component. In plain language, React.memo
prevents a functional component from being re-rendered if the props do not change. It does this by storing the component's last rendered output and using it again if the new props are the same as the previous ones.
Let's see an example of how you might use React.memo
in a frequently-re-rendered list:
const MyComponent = React.memo(function MyComponent(props) {
/* render using props */
});
function ParentComponent(){
const [count, setCount] = useState(0);
return (
<div>
<button onClick={() => setCount(current => current + 1)}>Inc</button>
<MyComponent data={count}/>
</div>
);
}
In the code above, MyComponent
will only re-render when the data
prop changes. If the ParentComponent re-renders for another reason and data
remains the same, MyComponent
will not re-render.
It is important to note that React.memo
only checks for prop changes. If your component relies on other things, like global state or the context API, React.memo
alone may not prevent unnecessary re-renders. It's also important to avoid using React.memo
everywhere preemptively, as it does involve some overhead. Profiling and measuring performance can guide you about when and where you should be using memoization.
While shouldComponentUpdate
and PureComponent are other ways to control re-renders, prior to React 16.6 they were only options for class components. Although they can still be useful for controlling re-renders, with hooks and the trend towards functional components, React.memo
becomes a better alternative for prevention of unnecessary re-renders.
Remember: Great power comes with great responsibility. Applying React.memo
should be a conscious decision, based on a need identified after profiling your application and recognizing certain components that re-render too often with the same props. As with any optimization, it should not be used wholesale without understanding its ramifications.