Вопрос проверяет понимание связи между созданием новых функций при каждом рендере и оптимизацией React-компонентов через мемоизацию.
Когда вы используете callback внутри метода map (или аналогичных структур) в React-компоненте, каждый раз при рендере создается новая функция. Это нормальное поведение JavaScript, но оно может вызывать нежелательные ререндеры дочерних компонентов.
Рассмотрим пример: у вас есть список элементов, и для каждого элемента вы передаете callback-функцию. Если дочерний компонент обернут в React.memo, он сравнивает предыдущие и новые props. Поскольку функция создается заново при каждом рендере, ссылка на неё меняется, и React.memo считает, что props изменились, вызывая ререндер.
// Пример проблемы
function Parent() {
const items = ['a', 'b', 'c'];
return (
<div>
{items.map(item => (
<Child key={item} onClick={() => handleClick(item)} />
))}
</div>
);
}Используйте хук useCallback, чтобы мемоизировать callback. Он вернет ту же самую функцию, пока не изменятся зависимости. Это предотвращает лишние ререндеры.
// Исправленный пример
function Parent() {
const items = ['a', 'b', 'c'];
const handleClick = useCallback((item) => {
console.log(item);
}, []);
return (
<div>
{items.map(item => (
<Child key={item} onClick={handleClick} />
))}
</div>
);
}Вывод: Используйте useCallback для стабильных ссылок на функции, передаваемые в дочерние компоненты, особенно при работе с большими списками или компонентами, обернутыми в React.memo. Это повышает производительность и предотвращает лишние ререндеры.
Уровень
Рейтинг:
4
Сложность:
5
Навыки
JavaScript
React
Ключевые слова
Подпишись на React Developer в телеграм
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию