Как прослушивать несколько событий в веб-компоненте
handleEvent() для работы со слушателями событий в веб-компонентах. Сегодня поговорим о том, как использовать его для обработки нескольких типов событий.Образец веб-компонента
Представим, что у нас есть веб-компонент <mirror-type>. Внутри него есть <input> и <button>.
Когда пользователь печатает в <input>, необходимо отображать набранный текст в div (внедрённый при загрузке веб-компонента). Когда он нажимает <button>, необходимо очистить ввод и отображаемый текст.
<mirror-type>
<label for="msg">Type some stuff</label>
<input type="text" id="msg">
<button>Clear</button>
</mirror-type>Создание веб-компонента
Давайте начнём создание веб-компонента.
Определим свойства this.input и this.button для существующего HTML. Также создадим элемент this.mirror и внедрим его в DOM.
(Если вы не уверены в том, что здесь происходит, рекомендую прочитать статью "Ваш первый веб-компонент" в качестве основы.)
customElements.define('mirror-type', class extends HTMLElement {
/**
* Инстанцирование компонент
*/
constructor () {
// Доступ к свойствам родительского класса
super();
// Определение свойств
this.input = this.querySelector('input');
this.button = this.querySelector('button');
this.mirror = document.createElement('div');
// Внедрение элемента mirror в DOM
this.append(this.mirror);
}
});Теперь можно добавить интерактивности.
Зеркалирование ввода
Внутри constructor() будем слушать события input на this.input и запускать метод handleEvent() в ответ.
constructor () {
// ...
// Внедрение элемента mirror в DOM
this.append(this.mirror);
// Прослушивание событий
this.input.addEventListener('input', this);
}
/**
* Обработка событий
* @param {Event} event Объект события
*/
handleEvent (event) {
// Обработка...
}Внутри метода handleEvent() обновляем .textContent в this.mirror, чтобы он соответствовал this.input.value.
/**
* Обработка событий
* @param {Event} event Объект события
*/
handleEvent (event) {
this.mirror.textContent = this.input.value;
}Очистка ввода
Теперь, допустим, нужно всё очистить при нажатии кнопки this.button.
Начнём с добавления события click для this.button.
// Прослушивание событий
this.input.addEventListener('input', this);
this.button.addEventListener('click', this);Но как обработать оба типа событий в методе handleEvent()?
Можно использовать выражение if...else.
/**
* Обработка событий
* @param {Event} event Объект события
*/
handleEvent (event) {
if (event.type === 'input') {
this.mirror.textContent = this.input.value;
} else {
this.input.value = '';
this.mirror.textContent = '';
}
}Но по мере масштабирования веб-компонента и роста количества слушателей управлять этим станет сложновато.
Поскольку класс веб-компонента является объектом, можно использовать скобочную нотацию для запуска его методов. Мне нравится создавать методы on*() для каждого события и использовать event.type в методе handleEvent() для их автоматического запуска.
/**
* Обработка событий
* @param {Event} event Объект события
*/
handleEvent (event) {
this[`on${event.type}`](event);
}
/**
* Обработка событий input
*/
oninput () {
this.mirror.textContent = this.input.value;
}
/**
* Обработка событий click
*/
onclick () {
this.input.value = '';
this.mirror.textContent = '';
}Хотя он немного более многословен, но по мере роста количества событий им легче управлять и поддерживать веб-компонент.
Все статьи серии о Веб-Компонентах/Web Component
- Ваш первый веб-компонент
- Добавление опций в веб-компонент
- Улучшение веб-компонента
- Различные способы инстанцирования веб-компонента
- Методы жизненного цикла веб-компонента
- Как обнаружить изменение атрибутов веб-компонента
- Как заставить веб-компоненты общаться (часть 1)
- Как заставить веб-компоненты общаться (часть 2)
- Больше способов инстанцирования веб-компонентов
- Как прослушивать несколько событий в веб-компоненте