Memoization

useMemo

function FactorialDisplay({ num }) {
  const computeFactorial = (n) => {
    console.log('Computing factorial...');
    if (n <= 1) return 1;
    return n * computeFactorial(n - 1);
  };
 
  const factorial = useMemo(() => computeFactorial(num), [num]);
 
  return (
    <div>
      <p>Factorial of {num} is {factorial}</p>
    </div>
  );
}

useCallback

  • memoize a function, returning the same function instance unless one of its dependencies has changed
  • useful for passing stable callback functions to child components, which can help prevent unnecessary re-renders
 

memo

  • lets you skip re-rendering a component when its props are unchanged
  • Syntax:
const MemoizedComponent = memo(SomeComponent, arePropsEqual?)
  • Example:
    • <Greeting/> gets rendered only when name is entered
function MyApp() {
  const [name, setName] = useState('');
  const [address, setAddress] = useState('');
  return (
    <>
      <label>
        Name{': '}
        <input value={name} onChange={e => setName(e.target.value)} />
      </label>
      <label>
        Address{': '}
        <input value={address} onChange={e => setAddress(e.target.value)} />
      </label>
      <Greeting name={name} />
    </>
  );
}
 
const Greeting = memo(function Greeting({ name }) {
  console.log("Greeting was rendered at", new Date().toLocaleTimeString());
  return <h3>Hello{name && ', '}{name}!</h3>;
});

useMemo vs useState+useEffect