Back to questions
Middle
5
Code review: перед тобой кусок кода из продакшена. Найди проблемы и предложи улучшения. Будет ли React.memo выполнять мемоизацию корректно, если в пропсах передаются функции и объекты?
Companies where asked
Smitex
Answer from AI
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 будет ререндериться каждый раз, даже если пропсы логически не изменились.