Жизненный цикл веб-компонента описывает последовательность этапов, через которые проходит компонент от создания до удаления из DOM. Понимание этих этапов критично для эффективного управления состоянием, оптимизации рендеринга и взаимодействия с внешними данными.
Когда создаётся новый экземпляр компонента, сначала вызывается конструктор класса:
import { LitElement, html, css } from 'lit';
class MyElement extends LitElement {
constructor() {
super();
this.title = 'Пример';
}
}
customElements.define('my-element', MyElement);
Ключевые моменты:
properties.static properties = {
title: { type: String }
};
connectedCallback)Метод connectedCallback вызывается, когда элемент
добавлен в DOM:
connectedCallback() {
super.connectedCallback();
console.log('Компонент подключен к DOM');
}
Особенности:
update и render)Lit использует реактивную модель обновления. При изменении реактивного свойства автоматически запускается процесс обновления:
updated(changedProperties) {
if (changedProperties.has('title')) {
console.log(`title изменён с ${changedProperties.get('title')} на ${this.title}`);
}
}
render() {
return html`<h1>${this.title}</h1>`;
}
Важные аспекты:
render вызывается каждый раз, когда одно из реактивных
свойств изменяется.update — промежуточный этап, где можно контролировать,
будет ли выполнен рендер.shouldUpdate(changedProperties) позволяет
оптимизировать рендеринг:shouldUpdate(changedProperties) {
return changedProperties.has('title');
}
disconnectedCallback)Метод disconnectedCallback вызывается при удалении
элемента из DOM:
disconnectedCallback() {
super.disconnectedCallback();
console.log('Компонент удалён из DOM');
}
Назначение:
attributeChangedCallback)Lit автоматически связывает реактивные свойства с атрибутами HTML. При изменении атрибута вызывается:
attributeChangedCallback(name, oldValue, newValue) {
super.attributeChangedCallback(name, oldValue, newValue);
console.log(`Атрибут ${name} изменён с ${oldValue} на ${newValue}`);
}
Особенности:
Lit по умолчанию использует Shadow DOM, изолируя стили компонента:
static styles = css`
h1 {
color: blue;
}
`;
Значение в жизненном цикле:
Иногда требуется асинхронное обновление данных перед рендером. Для
этого используют requestUpdate:
async firstUpdated() {
const data = await fetchData();
this.data = data;
this.requestUpdate();
}
Пояснение:
firstUpdated вызывается один раз после первого
рендеринга.Lit позволяет внедрять дополнительные кастомные события на разных этапах:
this.dispatchEvent(new CustomEvent('ready', { detail: { time: Date.now() } }));
Рекомендации:
Жизненный цикл Lit сочетает в себе возможности стандартных веб-компонентов с реактивной моделью рендеринга. Глубокое понимание последовательности методов позволяет создавать эффективные, устойчивые к изменениям DOM компоненты, минимизировать повторный рендер и управлять ресурсами на протяжении всего времени существования элемента.