Prevents unnecessary re-renders of function components when props haven’t changed (shallow comparison).

import { memo } from 'react';

const Child = memo(({ obj, onClick }: { obj: { a: number }, onClick: () => void }) => {
  console.log('Child rendered');
  return (
    <>
      <p>{obj.a}</p>
      <button onClick={onClick}>Click</button>
    </>
  );
});

Usage:

Note on props:

import { useMemo, useCallback } from 'react';

function Parent() {
  const memoizedObj = useMemo(() => ({ a: 1 }), []);
  const memoizedFn = useCallback(() => {
    console.log('clicked');
  }, []);

  return <Child obj={memoizedObj} onClick={memoizedFn} />;
}

Avoid using memo() if: