Больше способов инстанцирования веб-компонентов

Источник: «More ways to instantiate Web Components»
Одна из проблем при выполнении кода в constructor() заключается в том, что иногда элемент создаётся, но вложенный в него HTML ещё не готов.

На прошлой неделе мы рассмотрели несколько способов настройки 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;
}

// Установка оставшихся свойств
// ...

}

See the Pen

Использование атрибута [ready]

На прошлой неделе мы узнали, что веб-компоненты могут автоматически определять добавление, удаление или изменение атрибутов.

Можно использовать эту встроенную функциональность, чтобы определять, если атрибут [ready] добавлен к компоненту, и запускать настройку, когда это произойдёт.

// Определение атрибутов для наблюдения
static observedAttributes = ['ready'];

/**
* Настройка компонента при добавлении атрибута [ready]
*/

attributeChangedCallback () {
this.setup();
}

See the Pen

Какой подход следует использовать

Если бы я создавал веб-компоненты для системы проектирования, которая могла бы использоваться разными разработчиками различными способами, я бы, скорее всего, объединил несколько из этих подходов, чтобы предоставить разработчикам множество вариантов…

Какой подход вам нравится больше?

Все статьи серии о Веб-Компонентах/Web Component

Дополнительные материалы

Предыдущая Статья

Проблема с new URL(), и как URL.parse() её решает

Следующая Статья

Совет по безопасности: Повышение привилегий через шаблоны домена