Проверяет понимание проблем производительности и переиспользования при определении вложенных компонентов внутри рендер-функции React.
Когда вы определяете функцию, возвращающую JSX, внутри тела другого компонента, каждый раз при рендере родителя создается новая ссылка на эту функцию. React сравнивает типы элементов при согласовании (reconciliation). Если тип изменился (а новая функция — это новый тип), React считает, что старое поддерево больше не нужно, полностью размонтирует его и создает заново. Это приводит к потере состояния дочерних элементов, сбросу фокуса, повторным запросам и лишней работе.
function Parent() {
// Плохо: каждый рендер создает новый тип
function Child() {
return <div>Hello</div>;
}
return <Child />;
}Здесь при каждом обновлении Parent компонент Child будет полностью пересоздаваться. Если внутри Child есть useState или useEffect, они будут сброшены. Это особенно критично в больших списках или при частых обновлениях.
Выносите вложенные функции в отдельные компоненты на верхнем уровне модуля. Тогда тип стабилен, и React может эффективно обновлять только измененные части.
function Child() {
return <div>Hello</div>;
}
function Parent() {
return <Child />;
}Если функция нужна только для вычисления JSX без собственного состояния, можно использовать обычную функцию, возвращающую элементы, но не как компонент (с маленькой буквы), либо обернуть в useMemo, чтобы избежать лишних вычислений.
Избегайте определения компонентов внутри рендер-функции. Это ухудшает производительность и приводит к неожиданной потере состояния. Всегда выносите компоненты на верхний уровень, а для вспомогательных функций используйте обычные функции или хуки.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию