Жизненный цикл компонента — это последовательность этапов, которые проходит компонент от создания до удаления. Понимание этих этапов критически важно для правильного управления состоянием, side-эффектами и оптимизацией производительности.
React компоненты проходят три основные фазы:
constructor() — инициализация состояния и привязка методовstatic getDerivedStateFromProps() — синхронизация state с props (редко используется)render() — подготовка JSXcomponentDidMount() — вызов после вставки в DOM (идеально для side-эффектов)class Example extends React.Component {
constructor(props) {
super(props);
this.state = { data: null };
}
componentDidMount() {
fetchData().then(data => this.setState({ data }));
}
render() {
return <div>{this.state.data}</div>;
}
}
static getDerivedStateFromProps() — перед рендеромshouldComponentUpdate() — оптимизация (возвращает boolean)render() — перерендерgetSnapshotBeforeUpdate() — захват информации DOM перед изменениемcomponentDidUpdate() — после обновления DOMshouldComponentUpdate(nextProps, nextState) {
return nextProps.id !== this.props.id; // Оптимизация: рендер только при изменении id
}
componentDidUpdate(prevProps, prevState, snapshot) {
if (this.props.userID !== prevProps.userID) {
this.fetchData(this.props.userID);
}
}
componentWillUnmount() — очистка перед удалением (таймеры, подписки)componentWillUnmount() {
clearInterval(this.timerID);
this.subscription.unsubscribe();
}
С появлением Hooks жизненный цикл реализуется через:
useEffect(() => {}, []) — аналог componentDidMount (пустой массив зависимостей)useEffect(() => {}) — аналог componentDidUpdate (без массива)useEffect(() => { return () => {} }) — аналог componentWillUnmount (функция возврата)function Example({ userId }) {
const [data, setData] = useState(null);
useEffect(() => {
const subscription = subscribeToData(userId, setData);
return () => subscription.unsubscribe(); // Очистка
}, [userId]); // Зависимость - userId
return <div>{data}</div>;
}
Следует избегать:
componentWillMountcomponentWillReceivePropscomponentWillUpdateВместо них используйте:
getDerivedStateFromPropsgetSnapshotBeforeUpdatestatic getDerivedStateFromError() — обновление state при ошибкеcomponentDidCatch() — логирование ошибокclass ErrorBoundary extends React.Component {
state = { hasError: false };
static getDerivedStateFromError(error) {
return { hasError: true };
}
componentDidCatch(error, info) {
logErrorToService(error, info);
}
render() {
if (this.state.hasError) {
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
React.memo, useMemo, useCallbackReact.lazy + SuspenseshouldComponentUpdateuseEffect)Правильное использование методов жизненного цикла делает приложения более предсказуемыми и эффективными.