Sobes.tech
Назад к вопросам
Middle
4

Code review: перед тобой кусок кода из продакшена. Найди проблемы и предложи улучшения. Будет ли React.memo выполнять мемоизацию корректно, если в пропсах передаются функции и объекты?

Компании, где спрашивали
Smitex

Ответ от нейросети

sobes.tech AI

React.memo мемоизирует компонент, предотвращая повторный рендер, если пропсы не изменились по сравнению с предыдущим рендером. Однако, если в пропсах передаются функции или объекты, мемоизация может не сработать корректно, потому что при каждом рендере создаются новые ссылки на функции и объекты, и shallow сравнение React.memo обнаружит изменения.

Чтобы улучшить ситуацию:

  • Используйте useCallback для мемоизации функций, чтобы ссылки не менялись без необходимости.
  • Используйте useMemo для мемоизации объектов или массивов, передаваемых в пропсы.

Пример:

const Parent = () => {
  const [count, setCount] = React.useState(0);

  // Функция мемоизируется, ссылка не меняется при ререндере
  const handleClick = React.useCallback(() => {
    console.log('Clicked');
  }, []);

  // Объект мемоизируется
  const options = React.useMemo(() => ({ enabled: true }), []);

  return <Child onClick={handleClick} options={options} />;
};

const Child = React.memo(({ onClick, options }) => {
  console.log('Child render');
  return <button onClick={onClick}>Click me</button>;
});

Без useCallback и useMemo Child будет ререндериться каждый раз, даже если пропсы логически не изменились.