Веб-компоненты позволяют нам создавать повторно используемые настраиваемые элементы. Самая сильная сторона веб-компонента — его интероперабельность: будучи изначально поддерживаемыми браузерами, веб-компоненты могут использоваться в любой среде HTML, с любой структурой или вообще без нее.

Важным аспектом веб-компонентов является инкапсуляция. Вы можете отделить и скрыть структуру разметки, стиль и поведение, чтобы разные части страницы не конфликтовали.

Таким образом, веб-компоненты идеально подходят для разработки систем дизайна, общих компонентов и встроенных виджетов. Давайте посмотрим, как использовать собственный веб-компонент с лучшими библиотеками в отрасли:

Создавайте веб-компоненты с помощью Lit

Создание веб-компонента с нуля на простом Javascript может быстро превратиться в огромный беспорядок, который трудно масштабировать и поддерживать. К счастью, с помощью Лит мы можем создавать быстрые и легкие веб-компоненты.

В основе Lit лежит базовый класс компонентов, убивающий шаблоны, который обеспечивает реактивное состояние, стили с ограниченной областью действия и декларативную систему шаблонов, которая является крошечной, быстрой и выразительной.

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

Давайте создадим минимальный пользовательский элемент select и посмотрим, как мы можем работать с входными значениями примитивов и объектов. Обратите внимание, что мы не будем обсуждать строительные инструменты. Вы вольны использовать все, что пожелаете.

Начнем с элемента select:

Мы создаем SelectElement и определяем три входа — data, idKey и valKey. Мы также определяем состояние activeItem для отслеживания текущего выбранного элемента. Добавим шаблон:

Мы используем директиву repeat для эффективного рендеринга наших элементов. Он получает три параметра — collection, keyFunction, который принимает один элемент в качестве аргумента и возвращает для него уникальный ключ, и itemTemplate, который принимает элемент и его текущий индекс в качестве аргументов и возвращает TemplateResult.

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

Мы используем приятную функцию от Lit, которая называется логические атрибутивные выражения. Атрибут active будет добавлен или удален в зависимости от результата выражения. Мы используем его для стилизации элемента active.

Эта библиотека может оказаться полезной, если вы ищете генератор светящихся файлов:



Теперь, когда у нас есть базовый пользовательский элемент, давайте используем его в каждой библиотеке:

Использование веб-компонентов в Angular

Во-первых, нам нужно использовать схему CUSTOM_ELEMENTS_SCHEMA. Angular игнорирует пользовательские элементы (названные с дефисами), которые он не распознает, а не выдает ошибку.

Теперь мы можем использовать наш веб-компонент ui-select внутри компонента TodosComponent:

Нам не так много нужно сделать. Интеграция Angular с пользовательскими элементами работает из коробки. Он связывает свойство компонента todos со свойством data в элементе ui-select. Привязка события прослушивает событие select-item и вызывает метод onSelectItem() компонента всякий раз, когда оно отправляется.

Использование веб-компонентов в Vue

Как и в случае с Angular, нам нужно сказать Vue игнорировать пользовательские элементы, чтобы он не выдавал ошибки при встрече с пользовательским элементом. Вот как мы можем это сделать в Vite:

См. документы для альтернативных подходов. Теперь мы можем использовать наш пользовательский элемент внутри нашего компонента:

Vue упрощает использование пользовательских элементов. Мы привязываем свойство data элемента к ссылке todos и прослушиваем событие select-item, которое запускает функцию onSelect при отправке.

Использование веб-компонентов в Svelte

Чтобы использовать пользовательские элементы в компонентах Svelte, нам не нужно делать ничего особенного. Импортируйте пользовательский элемент и используйте его:

Использование веб-компонентов в React

React имеет наименее дружественную поддержку пользовательских элементов. Давайте посмотрим, как мы используем это с React:

Поскольку пользовательские элементы не являются компонентами React, они рассматриваются как стандартные элементы HTML. Нам нужно использовать JSON.stringify, потому что значение атрибута data обрабатывается как строка. Lit будет заниматься синтаксическим анализом, так как мы установили свойство data converter в Array.

Нам нужно получить ссылку на пользовательский элемент и зарегистрировать событие вручную, потому что React не поддерживает события пользовательских элементов.

Чтобы сделать его немного чище, вы можете использовать такие библиотеки, как use-custom-element:

Использование веб-компонента в Preact

Поддержка веб-компонентов в Preact намного лучше, чем в React. Средство визуализации Preact определяет, следует ли использовать свойство или атрибут, проверяя элемент DOM.

Нераспознанные свойства обработчика событий, переданные элементу DOM, регистрируются с использованием их регистра точно так, как указано:

Подпишитесь на меня в Medium или Twitter, чтобы узнать больше об Angular и JS!