В Lit взаимодействие с DOM и событиями строится на стандартных веб-технологиях, но наличие Shadow DOM накладывает определённые особенности на обработку событий. Понимание механизма всплытия событий и работы с границами Shadow DOM критично для построения модульных и изолированных компонентов.
Shadow DOM создаёт инкапсулированное дерево DOM, которое физически отделено от основного документа. Элементы внутри Shadow DOM имеют собственные стили и структуру, что предотвращает конфликт CSS и обеспечивает инкапсуляцию логики.
Ключевые моменты:
document.querySelector.События в DOM проходят три фазы:
В Lit, как и в стандартном DOM, можно подписаться на событие через
метод addEventListener с указанием опции
{ capture: true } для перехвата на фазе capture.
this.addEventListener('click', (e) => {
console.log('Клик внутри компонента');
}, { capture: true });
События в Shadow DOM имеют собственные особенности:
click,
input) всплывают сквозь границы Shadow DOM и доступны в
родительском документе.composed: true.this.dispatchEvent(new CustomEvent('custom-event', {
detail: { value: 42 },
bubbles: true,
composed: true
}));
Параметры:
bubbles: true — позволяет событию всплывать внутри
текущего дерева.composed: true — разрешает событию пересекать границу
Shadow DOM.Без composed: true событие остаётся локальным внутри
Shadow DOM.
Lit предоставляет декларативный способ подписки на события через
директиву @event:
html`
<button @click=${this.handleClick}>Нажми меня</button>
`;
При этом важно помнить:
class CounterComponent extends LitElement {
static properties = { count: { type: Number } };
constructor() {
super();
this.count = 0;
}
increment() {
this.count++;
this.dispatchEvent(new CustomEvent('count-changed', {
detail: { count: this.count },
bubbles: true,
composed: true
}));
}
render() {
return html`
<button @click=${this.increment}>+1</button>
<span>${this.count}</span>
`;
}
}
customElements.define('counter-component', CounterComponent);
В этом примере событие count-changed будет доступно и
родительскому компоненту, и всему документу благодаря
composed: true.
html`
<counter-component @count-changed=${this.onCountChanged}></counter-component>
`;
onCountChanged сработает только если событие было
composed.
Использование Shadow DOM и правильная настройка событий позволяют:
composed: true для внутренних
уведомлений).bubbles: true и
composed: true.В Lit понимание и управление всплытием событий и границами Shadow DOM позволяет строить надёжные, предсказуемые и масштабируемые интерфейсы. Эти принципы лежат в основе архитектуры современных веб-компонентов, обеспечивая как изоляцию, так и гибкость в интеграции с другими частями приложения.