Фреймворк Lit предоставляет удобный способ работы с
событиями клавиатуры и мыши через систему реактивных компонентов и
декларативного связывания событий с методами класса. Работа с событиями
в Lit строится вокруг директивы @event, которая позволяет
привязать обработчик к DOM-элементу прямо в шаблоне.
События в Lit обрабатываются с помощью синтаксиса:
html`<button @click=${this.handleClick}>Нажми меня</button>`
Ключевые моменты:
@click — событие, к которому происходит привязка.this.handleClick — метод класса, который будет вызван
при событии.Для клавиатурных событий используются стандартные DOM-события:
keydown — нажатие клавишиkeyup — отпускание клавишиkeypress — нажатие клавиши (устаревающее, но иногда
используется для совместимости)Пример привязки клавиатурного события:
html`<input @keydown=${this.handleKeydown} placeholder="Введите текст">`
Метод обработчика может использовать объект события:
handleKeydown(event) {
console.log(`Нажата клавиша: ${event.key}`);
if (event.key === 'Enter') {
this.submitForm();
}
}
Мышиные события включают:
click — кликdblclick — двойной кликmousedown / mouseup — нажатие и отпускание
кнопки мышиmousemove — движение мышиmouseenter / mouseleave — вход и выход
курсора с элементаПример сложной обработки мыши:
html`
<div
@mousedown=${this.startDrag}
@mousemove=${this.onDrag}
@mouseup=${this.endDrag}
style="width:200px; height:200px; background:#ccc;">
Перетащи меня
</div>
`
Методы:
startDrag(event) {
this.dragging = true;
this.startX = event.clientX;
this.startY = event.clientY;
}
onDrag(event) {
if (!this.dragging) return;
const dx = event.clientX - this.startX;
const dy = event.clientY - this.startY;
this.style.transform = `translate(${dx}px, ${dy}px)`;
}
endDrag(event) {
this.dragging = false;
}
В Lit можно использовать делегирование событий через родительский элемент, особенно для динамически создаваемых элементов. Пример:
html`
<ul @click=${this.handleListClick}>
<li data-id="1">Элемент 1</li>
<li data-id="2">Элемент 2</li>
<li data-id="3">Элемент 3</li>
</ul>
`
Метод:
handleListClick(event) {
const li = event.target.closest('li');
if (!li) return;
console.log(`Клик по элементу с id=${li.dataset.id}`);
}
Lit поддерживает работу с объектом event полностью. Для
предотвращения стандартного поведения и остановки всплытия используются
методы preventDefault() и
stopPropagation():
handleClick(event) {
event.preventDefault(); // предотвращает стандартное действие
event.stopPropagation(); // останавливает всплытие события
console.log('Обработано событие click');
}
Можно комбинировать клавиатурные и мышиные события для сложных интерфейсов:
html`<div @keydown=${this.handleKeyMouseCombination} @click=${this.handleClick}>Комбинации</div>`
Чтобы сохранить контекст this в методах обработчиков,
рекомендуется использовать стрелочные функции или привязку через
конструктор:
constructor() {
super();
this.handleClick = this.handleClick.bind(this);
}
Или:
handleClick = (event) => {
console.log('Контекст сохранён автоматически');
}
Lit поддерживает синтаксис модификаторов событий:
.preventDefault — предотвращение действия браузера.stopPropagation — остановка всплытия.capture — использование фазового захватаПример:
html`<form @submit=${this.onSubmit} .preventDefault=${true}>Отправка формы</form>`
@event=${handler}.this лучше сохранять через стрелочные функции
или bind.event.key).preventDefault или
stopPropagation.Обработка событий в Lit сочетает декларативность с полной гибкостью DOM API, что позволяет создавать интерактивные и отзывчивые компоненты с минимальным количеством кода и высокой читаемостью.