Больше способов инстанцирования веб-компонентов
На прошлой неделе мы рассмотрели несколько способов настройки HTML в веб-компоненте, но сегодня я хочу поделиться ещё двумя.
Использование requestAnimationFrame() или setTimeout()
Один из вариантов решения этой проблемы — попытаться настроить веб-компонент, и если какой-либо требуемый HTML отсутствует, использовать requestAnimationFrame() или setTimeout(), чтобы попробовать снова после следующей прорисовки браузера.
Например, представьте, что в классе веб-компонента есть метод setup(), настраивающий DOM и добавляющий все интерактивные возможности.
/**
* Настройка веб-компонента при подключении к DOM
*/
setup () {
// Установка свойств
this.button = this.querySelector('button');
this.count = parseFloat(this.getAttribute('start')) || 0;
this.step = parseFloat(this.getAttribute('step')) || 1;
this.text = this.getAttribute('text') || 'Clicked Times';
// Прослушивание события click
this.button.addEventListener('click', this);
// Объявление об обновлении UI
this.button.setAttribute('aria-live', 'polite');
}Установив this.button, можно проверить, существует ли свойство.
Если нет, то можно использовать requestAnimationFrame() для повторного запуска this.setup() при следующей прорисовке браузера, а остальную настройку отложить до этого момента.
/**
* Настройка веб-компонента при подключении к DOM
*/
setup () {
// Получение button
this.button = this.querySelector('button');
// Если его нет, повторяем попытку после следующей прорисовки.
if (!this.button) {
requestAnimationFrame(() => {
this.setup();
});
return;
}
// Установка оставшихся свойств
// ...
}Использование атрибута [ready]
На прошлой неделе мы узнали, что веб-компоненты могут автоматически определять добавление, удаление или изменение атрибутов.
Можно использовать эту встроенную функциональность, чтобы определять, если атрибут [ready] добавлен к компоненту, и запускать настройку, когда это произойдёт.
// Определение атрибутов для наблюдения
static observedAttributes = ['ready'];
/**
* Настройка компонента при добавлении атрибута [ready]
*/
attributeChangedCallback () {
this.setup();
}Какой подход следует использовать
Если бы я создавал веб-компоненты для системы проектирования, которая могла бы использоваться разными разработчиками различными способами, я бы, скорее всего, объединил несколько из этих подходов, чтобы предоставить разработчикам множество вариантов…
- Автоматическое инстанцирование при создании элемента.
- Метод
this.setup(), который можно запустить вручную - Использование
requestAnimationFrame()для повторения нескольких попыток (я бы остановился после нескольких неудачных попыток). - Атрибут
[ready]
Какой подход вам нравится больше?
Все статьи серии о Веб-Компонентах/Web Component
- Ваш первый веб-компонент
- Добавление опций в веб-компонент
- Улучшение веб-компонента
- Различные способы инстанцирования веб-компонента
- Методы жизненного цикла веб-компонента
- Как обнаружить изменение атрибутов веб-компонента
- Как заставить веб-компоненты общаться (часть 1)
- Как заставить веб-компоненты общаться (часть 2)
- Больше способов инстанцирования веб-компонентов