JS Guide
HomeQuestionsSearchResources
Search

Built for developers preparing for JavaScript, React & TypeScript interviews.

ResourcesQuestionsSupport
HomeQuestionsSearchProgress
HomeQuestionsperformance
PrevNext
performance
mid
react

What are common React performance optimization techniques?

react
memo
useMemo
useCallback
virtualization
Quick Answer

Optimize React apps by: preventing unnecessary re-renders (memo, useMemo, useCallback), virtualizing long lists, code splitting routes/components, optimizing context usage, and using proper keys. Measure first with React DevTools Profiler.

Detailed Explanation

Re-render Prevention:

  • React.memo() for component memoization
  • useMemo() for expensive computations
  • useCallback() for stable callbacks

List Optimization:

  • Virtualization for long lists
  • Proper key usage
  • Pagination over infinite scroll

Code Splitting:

  • Route-based splitting
  • Lazy load heavy components
  • Dynamic imports

Context Optimization:

  • Split contexts by update frequency
  • Memoize context values
  • Use selectors

Measuring:

  • React DevTools Profiler
  • why-did-you-render
  • Chrome Performance tab

Code Examples

Preventing unnecessary re-renders
import { memo, useMemo, useCallback, useState } from 'react';

// Memoized component - only re-renders when props change
const ExpensiveList = memo(function ExpensiveList({ items, onItemClick }) {
  console.log('ExpensiveList rendered');
  return (
    <ul>
      {items.map(item => (
        <li key={item.id} onClick={() => onItemClick(item)}>
          {item.name}
        </li>
      ))}
    </ul>
  );
});

function App() {
  const [count, setCount] = useState(0);
  const [items] = useState([{ id: 1, name: 'Item 1' }]);

  // Without useCallback, new function every render
  // ExpensiveList re-renders even though items didn't change!
  const handleClick = useCallback((item) => {
    console.log('Clicked:', item);
  }, []); // Stable reference

  // Without useMemo, computed every render
  const sortedItems = useMemo(() => {
    console.log('Sorting items...');
    return [...items].sort((a, b) => a.name.localeCompare(b.name));
  }, [items]); // Only recompute when items change

  return (
    <div>
      <button onClick={() => setCount(c => c + 1)}>Count: {count}</button>
      {/* ExpensiveList doesn't re-render when count changes */}
      <ExpensiveList items={sortedItems} onItemClick={handleClick} />
    </div>
  );
}

Resources

React - Optimizing Performance

docs

React Window

docs

Related Questions

How does code splitting work and when should you use it?

mid
bundling
Previous
How do you analyze and reduce bundle size?
Next
What is the difference between SSR, SSG, and CSR?