Какие компоненты жизненного цикла нужны в типичном решении и за что они отвечают?
Жизненный цикл
Речь о том, какие этапы (методы) жизненного цикла реально нужны в типичном компоненте и за что каждый отвечает.
В функциональных компонентах (стандарт)
Всё выражается через useEffect и родственников:
- Монтирование —
useEffect(fn, []): инициализация, разовая загрузка, установка глобальных слушателей, аналитика. - Обновление по данным —
useEffect(fn, [deps]): перезапрос при смене id, переподключение к каналу. - Размонтирование — cleanup-функция эффекта: отписки, clearInterval, close, abort.
- До отрисовки кадра —
useLayoutEffect: измерения DOM и синхронная правка (позиционирование, скролл) без мигания. - Ленивая инициализация —
useState(() => ...)/ useRef: значение до первого рендера, один раз.
useEffect(() => {
const conn = connect(roomId); // mount + update по roomId
return () => conn.close(); // unmount + перед перезапуском
}, [roomId]);В классовых (легаси)
- componentDidMount — инициализация после вставки в DOM.
- componentDidUpdate(prevProps) — реакция на изменения (со сравнением prevProps, иначе цикл).
- componentWillUnmount — очистка ресурсов.
- shouldComponentUpdate / PureComponent — пропуск лишних рендеров (аналог React.memo).
- getDerivedStateFromError / componentDidCatch — Error Boundary (без хук-аналогов).
- Редко: getSnapshotBeforeUpdate (снять позицию скролла до коммита).
Правильная модель
С хуками мыслят не «этапами жизни», а синхронизацией: эффект описывает связь компонента с внешней системой, React сам решает, когда её установить, переустановить и разорвать.
Коротко для собеседования
Нужны три момента: монтирование (инициализация — useEffect(fn, []) / componentDidMount), обновление по данным (useEffect(fn, [deps]) / componentDidUpdate с проверкой prevProps) и размонтирование (cleanup / componentWillUnmount). Плюс useLayoutEffect для измерений до отрисовки и Error Boundary в классах.