PassFront
  1. PassFront
  2. База знаний
  3. Хуки

Какие классовые компоненты заменяет 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 (только класс).

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