Какие классовые компоненты заменяет useEffect?
Хуки
useEffect заменяет три метода жизненного цикла классового компонента: componentDidMount, componentDidUpdate и componentWillUnmount — в зависимости от массива зависимостей и cleanup-функции.
Соответствие
// componentDidMount
useEffect(() => { init(); }, []);
// componentDidUpdate (по конкретным данным)
useEffect(() => { load(userId); }, [userId]);
// componentWillUnmount
useEffect(() => {
return () => cleanup();
}, []);
// всё сразу: mount + update + unmount
useEffect(() => {
const conn = connect(roomId);
return () => conn.close();
}, [roomId]);Отличия от классовой модели
- componentDidUpdate требовал ручного сравнения
prevProps.userId !== this.props.userId; useEffect делает это сам через deps. - Cleanup вызывается не только при размонтировании, но и перед каждым перезапуском эффекта — в классах это приходилось писать вручную в componentDidUpdate.
- Логика группируется по ресурсу (подписка и отписка рядом), а не разносится по методам.
Чего useEffect НЕ заменяет
- shouldComponentUpdate / PureComponent → это React.memo.
- getDerivedStateFromError / componentDidCatch (Error Boundary) → аналогов нет, нужен класс.
- getSnapshotBeforeUpdate → частично useLayoutEffect.
- componentWillMount и другие UNSAFE_-методы → устарели (работают, но StrictMode предупреждает), прямой замены не требуют.
Коротко для собеседования
useEffect покрывает componentDidMount ([]), componentDidUpdate ([deps], без ручного сравнения prevProps) и componentWillUnmount (cleanup, который к тому же вызывается перед каждым перезапуском). Не заменяет shouldComponentUpdate (это React.memo) и componentDidCatch (только класс).