Вопрос проверяет понимание механизма мемоизации компонентов и критериев сравнения пропсов в React.
React.memo сравнивает пропсы текущего и предыдущего рендера. По умолчанию используется поверхностное сравнение. Если все пропсы считаются одинаковыми, компонент не перерендеривается. Если хотя бы один проп изменился, рендер происходит заново. Также можно передать собственную функцию сравнения.
React.memo — это инструмент оптимизации, который позволяет пропускать лишние рендеры компонентов.
React.memo — это HOC, который мемоизирует результат рендера функционального компонента на основе его пропсов.
По умолчанию React:
сравнивает пропсы по ссылке
использует Object.is
не делает глубокого сравнения
Пример:
const MyComponent = React.memo(function MyComponent({ value }) {
return <div>{value}</div>;
});
Если value — примитив и не изменился, рендер будет пропущен.
Ререндер произойдёт, если:
изменился примитив (number, string, boolean)
передан новый объект
передана новая функция
изменился key
Можно передать собственный компаратор:
React.memo(Component, (prevProps, nextProps) => {
return prevProps.id === nextProps.id;
});
Но:
это усложняет код
может быть дороже, чем сам рендер
React.memo:
не предотвращает рендер родителя
не гарантирует ускорение
полезен только при дорогом рендере
React.memo решает о перерендере на основе поверхностного сравнения пропсов. Эффективность зависит от стабильности передаваемых данных.