Вопрос проверяет понимание мемоизации функций в React и умение определять, когда useCallback действительно необходим для оптимизации производительности.
useCallback в React используется для мемоизации функций. Он возвращает одну и ту же ссылку на функцию между рендерами, пока не изменятся зависимости. Это полезно в двух основных сценариях:
Если функция передается в обычный HTML-элемент (например, <button onClick={handleClick}>), useCallback не дает выигрыша, так как ререндер все равно произойдет. Также не стоит использовать его для простых обработчиков событий, если нет измеримых проблем с производительностью. Преждевременная оптимизация может усложнить код.
import React, { useState, useCallback } from 'react';
const ExpensiveChild = React.memo(({ onClick }) => {
console.log('Child re-rendered');
return <button onClick={onClick}>Click</button>;
});
function Parent() {
const [count, setCount] = useState(0);
// Без useCallback: новая функция при каждом рендере
const handleClick = useCallback(() => {
setCount(prev => prev + 1);
}, []); // Зависимости пусты, функция стабильна
return (
<div>
<p>Count: {count}</p>
<ExpensiveChild onClick={handleClick} />
</div>
);
}В этом примере ExpensiveChild обернут в React.memo. Без useCallback каждый ререндер Parent создавал бы новую функцию, и React.memo не сработал бы. С useCallback ссылка на функцию стабильна, и дочерний компонент не ререндерится лишний раз.
Используйте useCallback только когда есть реальная проблема с производительностью или когда функция участвует в зависимостях других хуков. Не применяйте его для всех функций подряд — это усложняет код без пользы.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию