Декоратор customElement является ключевым инструментом
при создании пользовательских веб-компонентов с использованием
библиотеки FAST Element. Он позволяет зарегистрировать класс элемента в
DOM, связывая его с определённым именем тега. В основе работы лежит
стандарт Web Components, но FAST Element упрощает синтаксис и добавляет
возможности реактивности и шаблонизации.
Синтаксис customElement выглядит следующим образом:
import { FASTElement, customElement, html } from "@microsoft/fast-element";
@customElement({
name: "my-element",
template: html`<p>Hello, FAST!</p>`,
styles: css`
p {
color: blue;
font-weight: bold;
}
`
})
class MyElement extends FASTElement {}
Ключевые моменты:
name – уникальное имя тега, которое
будет использоваться в HTML (my-element). Обязательное
свойство.template – определяет внутреннюю
структуру элемента с помощью шаблона FAST, поддерживает реактивные
привязки.styles – CSS, применяемый только к
данному компоненту, изолированный от внешнего окружения.После применения декоратора элемент автоматически регистрируется в
браузере через customElements.define.
Шаблоны FAST Element создаются с помощью функции html,
которая поддерживает динамическую привязку к свойствам класса.
Например:
const template = html<MyElement>`
<p>${x => x.message}</p>
`;
x => x.message — функция, привязывающая значение
свойства message к содержимому параграфа.Стили задаются через css:
import { css } from "@microsoft/fast-element";
const styles = css`
p {
font-size: 16px;
color: red;
}
`;
customElement и реактивные свойстваFAST Element автоматически отслеживает изменения свойств и обновляет шаблон:
@customElement({
name: "user-card",
template: html<UserCard>`<h1>${x => x.name}</h1>`
})
class UserCard extends FASTElement {
name = "Иван";
}
name вызовет автоматический рендер
без необходимости вручную обновлять DOM.observable, который можно использовать для сложных
зависимостей.import { observable } from "@microsoft/fast-element";
class UserCard extends FASTElement {
@observable name = "Иван";
}
customElement поддерживает несколько опций:
name – имя тега.template – шаблон компонента.styles – CSS стили.shadowOptions – настройки Shadow DOM
(например, { mode: 'open' }).Пример:
@customElement({
name: "fancy-button",
template: html`<button>${x => x.label}</button>`,
styles: css`button { background: gold; }`,
shadowOptions: { mode: "open" }
})
class FancyButton extends FASTElement {
label = "Click me";
}
Можно использовать customElement для создания элементов,
расширяющих стандартные HTML-теги:
@customElement({
name: "fancy-input",
template: html`<input type="text" value="${x => x.value}" />`,
shadowOptions: { mode: "open" }
})
class FancyInput extends FASTElement {
value = "Hello";
}
Декоратор можно комбинировать с функциями для динамического создания компонентов:
function createCustomElement(name, template, styles) {
@customElement({ name, template, styles })
class DynamicElement extends FASTElement {}
return DynamicElement;
}
const AlertBox = createCustomElement(
"alert-box",
html`<div>${x => x.message}</div>`,
css`div { color: red; }`
);
FASTElement.Декоратор customElement в FAST Element обеспечивает
простой, но мощный механизм создания реактивных веб-компонентов с
изолированными стилями и поддержкой шаблонов. Комбинация с
observable, Shadow DOM и функциями шаблонов позволяет
строить масштабируемые интерфейсы без сложной ручной работы с DOM.