Жизненный цикл компонента в Preact определяется последовательностью этапов от его создания до удаления из DOM. Управление этими фазами позволяет оптимизировать рендеринг, работать с побочными эффектами и корректно обрабатывать асинхронные операции.
Mounting (монтирование) — это процесс добавления компонента в DOM. В Preact он включает несколько ключевых моментов:
constructor Конструктор вызывается при создании
экземпляра класса компонента. Здесь обычно инициализируется состояние
(this.state) и привязываются методы к текущему контексту
(this).
class MyComponent extends Component {
constructor(props) {
super(props);
this.state = { counter: 0 };
this.handleClick = this.handleClick.bind(this);
}
}componentWillMount (устаревший) В современных
версиях Preact использование этого метода не рекомендуется. Логика,
связанная с подготовкой данных до рендера, переносится в конструктор или
методы useEffect при использовании функциональных
компонентов.
render Метод render отвечает за
генерацию виртуального DOM. На этом этапе создаётся описание структуры
компонента без непосредственного добавления в реальный DOM.
render() {
return <button onCl ick={this.handleClick}>{this.state.counter}</button>;
}componentDidMount Этот метод вызывается после того, как компонент был смонтирован в DOM. Он идеально подходит для выполнения асинхронных операций, установки таймеров или подписки на события.
componentDidMount() {
console.log("Компонент смонтирован");
}Для функциональных компонентов эквивалентом
componentDidMount является хук useEffect с
пустым массивом зависимостей:
useEffect(() => {
console.log("Компонент смонтирован");
}, []);
Updating (обновление) происходит при изменении
props или state. Основные методы жизненного
цикла при обновлении:
shouldComponentUpdate(nextProps, nextState)
Позволяет контролировать необходимость повторного рендера. Возврат
false предотвращает обновление, что важно для оптимизации
производительности.
shouldComponentUpdate(nextProps, nextState) {
return nextState.counter !== this.state.counter;
}componentWillUpdate (устаревший) Ранее
использовался для подготовки к обновлению. Сейчас рекомендуется
использовать getDerivedStateFromProps или логику внутри
render.
render При обновлении метод render
вызывается заново для генерации нового виртуального DOM. Preact затем
сравнивает старый и новый виртуальные DOM-деревья (diffing) и обновляет
только изменённые части реального DOM.
componentDidUpdate(prevProps, prevState) Вызывается после завершения обновления. Служит для синхронизации состояния с внешними системами, вызова сторонних API или изменения DOM вне виртуального дерева.
componentDidUpdate(prevProps, prevState) {
if (prevState.counter !== this.state.counter) {
console.log(`Счётчик изменился на ${this.state.counter}`);
}
}Для функциональных компонентов используется useEffect с
зависимостями:
useEffect(() => {
console.log(`Счётчик изменился на ${counter}`);
}, [counter]);
Unmounting (демонтирование) — стадия удаления компонента из DOM. Ключевой метод:
componentWillUnmount Выполняется перед удалением компонента. Здесь освобождаются ресурсы, отменяются таймеры и подписки на события.
componentWillUnmount() {
clearInterval(this.timer);
}Для функциональных компонентов очистка осуществляется внутри функции
возврата useEffect:
useEffect(() => {
const timer = setInterval(() => console.log("Tick"), 1000);
return () => clearInterval(timer);
}, []);
useEffect, getDerivedStateFromProps).componentDidMount или useEffect, очистка — в
componentWillUnmount или возвратной функции
useEffect.shouldComponentUpdate и оптимизация ререндеринга
критичны для производительных приложений с большим количеством
компонентов.Жизненный цикл компонентов является фундаментом для построения устойчивой архитектуры в Preact, обеспечивая контроль над состоянием, ресурсами и взаимодействием с DOM.