Этот вопрос проверяет знание различий между классовыми и функциональными компонентами в React 18, а также понимание их возможностей.
В React 18 почти все возможности классовых компонентов можно реализовать в функциональных с помощью хуков. Единственное исключение — Error Boundaries (перехват ошибок в дочерних компонентах). Пока их можно создать только через классовые компоненты или используя готовые npm-пакеты.
Функциональные компоненты с хуками в React 18 полностью заменяют классовые. Раньше классы были нужны для состояния (state), жизненного цикла (componentDidMount, componentWillUnmount и др.) и рефов (this.refs). Теперь всё это делается через хуки:
Состояние → useState, useReducer
Жизненный цикл → useEffect, useLayoutEffect
Контекст → useContext
Рефы → useRef
Но есть одно исключение — Error Boundaries. Это специальный механизм для перехвата ошибок в дочерних компонентах (например, если компонент упал с ошибкой). В React пока нет хука для этого, поэтому Error Boundaries можно создать только через классовый компонент с методами componentDidCatch и getDerivedStateFromError.
class ErrorBoundary extends React.Component {
state = { hasError: false };
static getDerivedStateFromError() { return { hasError: true }; }
componentDidCatch(error, info) { console.log(error, info); }
render() { return this.state.hasError ? "Ошибка!" : this.props.children; }
}
// Использование:
<ErrorBoundary>
<MyComponent />
</ErrorBoundary>Да, если использовать готовые решения, например, react-error-boundary. Но внутри таких пакетов всё равно используется класс.
Нет, если писать с нуля — без классов или npm-пакетов не получится.
Пока React не добавил хук типа useErrorBoundary, но в будущем это возможно.
В React 18 нет других фич, кроме Error Boundaries, которые нельзя реализовать в функциональных компонентах. Всё остальное — хуки покрывают. Если нужно ловить ошибки в дереве компонентов, пока придётся использовать классы или готовые библиотеки.