PassFront
  1. PassFront
  2. База знаний
  3. Компоненты

Почему отказались от классовых компонентов в React?

Компоненты

Классовые компоненты никто формально не «отменял» — они поддерживаются до сих пор. Но после выхода хуков (React 16.8, 2019) экосистема перешла на функциональные, потому что классы имели системные проблемы.

Проблемы классовых компонентов

Переиспользование логики. У классов не было хорошего механизма шарить логику с состоянием: HOC и render props порождали «обёрточный ад» (десятки уровней вложенности в DevTools), конфликты имён props и неявные зависимости. Кастомные хуки решили это прямолинейно: логика — просто функция.

Размазанная логика. Один ресурс жил в трёх методах: подписка в componentDidMount, переподписка в componentDidUpdate (с ручным сравнением prevProps), отписка в componentWillUnmount. Забытая ветка — утечка. useEffect собирает всё это в одном месте с автоматическим cleanup.

this и биндинг. Забытый this.handleClick = this.handleClick.bind(this) или стрелочные поля класса — постоянный источник багов и вопрос собеседований, не имеющий отношения к продукту.

Сложность оптимизации и компиляции. Классы хуже минифицируются, мешают tree-shaking'у, а их модель «всегда актуальный this.props» конфликтует с конкурентным рендерингом, где каждый рендер должен работать со своим «снимком» данных.

Что стало решающим

// вся логика ресурса — в одной строке компонента
const user = useUser(userId);

Хуки дали композицию логики, которую классы не могли предложить, а новые возможности React (конкурентные фичи, серверные компоненты, компилятор) проектируются только под функции.

Коротко для собеседования

От классов ушли из-за: невозможности нормально переиспользовать логику с состоянием (HOC-ад против кастомных хуков), размазывания связанной логики по методам жизненного цикла, багов с this, худшей оптимизируемости и несовместимости модели с конкурентным рендерингом. Классы живы, но остались для легаси и Error Boundaries.

Другие вопросы раздела