Жизненный цикл компонента — это последовательность этапов, которые проходит компонент от создания до удаления. Понимание этих этапов критически важно для правильного управления состоянием, 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>;
}
Следует избегать:
componentWillMount
componentWillReceiveProps
componentWillUpdate
Вместо них используйте:
getDerivedStateFromProps
getSnapshotBeforeUpdate
static 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
, useCallback
React.lazy
+ Suspense
shouldComponentUpdate
useEffect
)Правильное использование методов жизненного цикла делает приложения более предсказуемыми и эффективными.