> Что такое pure component и как создать его на примере функционального компонента в React (React)
Уровень: junior · Роль: frontend · Категория: Технические вопросы
Компании: Aston
Стек: React
> Пример ответа
Короткий ответ
Pure component - это компонент, который рендерится только при изменении его props или state, выполняя поверхностное сравнение (shallow comparison). В функциональных компонентах React для этого используется React.memo. Он предотвращает лишние ререндеры, если входные данные не изменились, что повышает производительность.
Подробное объяснение
Pure component в React - это компонент, который реализует shouldComponentUpdate с поверхностным сравнением props и state. В классовых компонентах для этого используется React.PureComponent, а в функциональных - React.memo.
React.memo - это higher-order component, который оборачивает функциональный компонент и кеширует результат его рендера. При каждом ререндере родителя React сравнивает новые props с предыдущими с помощью Object.is. Если props не изменились, React использует закешированный результат и пропускает рендер компонента.
Важно понимать, что поверхностное сравнение работает только для примитивных типов и ссылок на объекты. Если вы передаете объект или массив как prop, и создаете его заново при каждом рендере родителя, сравнение будет показывать изменение, и React.memo не сработает.
На практике
React.memo применяется в следующих случаях:
- Компонент часто ререндерится, но его props редко меняются
- Компонент содержит тяжелые вычисления или рендерит много дочерних элементов
- Компонент отображает статические данные, которые не зависят от часто меняющегося state родителя
Не стоит оборачивать каждый компонент в React.memo без необходимости - это добавляет overhead на сравнение props. Используйте его только когда видите проблему производительности или знаете, что компонент будет ререндериться без изменения props.
Пример кода
JSXimport React, { memo } from 'react';// Обычный функциональный компонентconst UserCard = ({ name, age }) => {console.log('Рендер UserCard');return (<div><h3>{name}</h3><p>Возраст: {age}</p></div>);};// Pure component с React.memoconst PureUserCard = memo(UserCard);// Использование в родительском компонентеconst Parent = () => {const [count, setCount] = useState(0);const user = { name: 'Иван', age: 25 };return (<div><button onClick={() => setCount(c => c + 1)}>Кликов: {count}</button>{/* PureUserCard не ререндерится при клике на кнопку */}<PureUserCard name={user.name} age={user.age} /></div>);};
Как отвечать на собеседовании
Начни с определения pure component и его цели - оптимизация производительности за счет предотвращения лишних ререндеров. Объясни, что в функциональных компонентах используется React.memo. Упомяни, что сравнение поверхностное, и приведи пример, когда это может не сработать (передача новых объектов). Покажи понимание trade-off: React.memo добавляет overhead, поэтому его не стоит применять везде бездумно.
Что проверяет интервьюер
- Понимание механизма ререндера в React
- Знание разницы между обычным компонентом и pure component
- Умение объяснить поверхностное сравнение и его ограничения
- Практический опыт использования
React.memo - Понимание, когда оптимизация нужна, а когда избыточна
Типичные ошибки
- Путать
React.memoсuseMemo- это разные вещи: memo для компонента, useMemo для значений - Думать, что
React.memoсравнивает глубоко - он делает только поверхностное сравнение - Оборачивать в memo компоненты с изменяющимися props, что делает оптимизацию бесполезной
- Использовать memo для компонентов с children, которые создаются заново при каждом рендере родителя
- Забывать, что memo не влияет на ререндер из-за изменения собственного state или context
> Похожие задачи по frontend
Как добавить обработчик события на DOM-элемент в React?
Является ли изменение пропсов триггером ререндеринга в React
Каковы преимущества Material UI
Каков порядок вывода в консоль в React-компоненте?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью