FAST Element предоставляет мощный механизм для создания веб-компонентов с использованием декораторов, который упрощает определение реактивных свойств, шаблонов и поведения элементов. Декораторы в FAST Element используются для аннотирования классов, свойств и методов, чтобы автоматически интегрировать их с жизненным циклом компонента и системой привязки данных.
@customElementДекоратор @customElement регистрирует класс как
кастомный элемент и связывает его с определённым именем
в DOM. Он автоматически создает конструктор и связывает компонент с
шаблоном.
import { FASTElement, html, css, customElement } from "@microsoft/fast-element";
const template = html`
${x => x.message}
`;
const styles = css`
p {
color: blue;
}
`;
@customElement({ name: "my-component", template, styles })
class MyComponent extends FASTElement {
message = "Привет, FAST!";
}
Особенности:
name — обязательное поле, определяет имя тега.template — связывает HTML-шаблон с компонентом.styles — подключает CSS напрямую к компоненту.@attr@attr используется для создания атрибутов
HTML, которые синхронизируются со свойствами класса. Это
ключевой инструмент для реактивности и двусторонней привязки.
import { FASTElement, attr } from "@microsoft/fast-element";
class MyComponent extends FASTElement {
@attr title; // тип string по умолчанию
@attr({ mode: "boolean" }) disabled; // логический атрибут
}
Параметры @attr:
mode — определяет тип атрибута: "string",
"boolean", "number".attribute — позволяет задать другое имя атрибута в
DOM.Пример работы boolean-атрибута:
Если в DOM присутствует disabled, свойство
disabled в классе будет true. При его
изменении на false атрибут автоматически удаляется.
@observable@observable используется для создания
реактивного свойства, которое автоматически инициирует
перерисовку компонента при изменении значения. В отличие от
@attr, оно не связано с HTML-атрибутом, а управляет только
внутренним состоянием.
import { FASTElement, observable } from "@microsoft/fast-element";
class Counter extends FASTElement {
@observable count = 0;
increment() {
this.count++;
}
}
Особенности:
${x => x.count}.propertyChanged:countChanged(oldValue, newValue) {
console.log(`count изменился с ${oldValue} на ${newValue}`);
}
Changed автоматически
вызывается при каждом изменении.@watch@watch позволяет следить за изменениями
нескольких свойств или сложных зависимостей. Он более
гибкий, чем propertyChanged.
import { FASTElement, observable, watch } from "@microsoft/fast-element";
class PersonComponent extends FASTElement {
@observable firstName = "";
@observable lastName = "";
@watch("firstName,lastName")
fullNameChanged() {
console.log(`Полное имя: ${this.firstName} ${this.lastName}`);
}
}
Особенности:
@ref@ref позволяет сохранять ссылку на
DOM-элемент внутри компонента для прямого доступа.
import { FASTElement, ref, html } from "@microsoft/fast-element";
const template = html`
`;
class MyComponent extends FASTElement {
inputElement;
focusInput() {
this.inputElement.focus();
}
}
Особенности:
querySelector.html.Декораторы в FAST Element корректно работают с наследованием классов.
Атрибуты, реактивные свойства и методы, помеченные
@observable или @attr, автоматически
учитываются при расширении компонента:
class BaseComponent extends FASTElement {
@attr baseProp;
@observable count = 0;
}
@customElement({ name: "extended-component", template })
class ExtendedComponent extends BaseComponent {
@attr extendedProp;
}
ExtendedComponent наследует все свойства и реактивность
BaseComponent.baseProp и extendedProp доступны
в DOM.@attr и @observable могут использоваться
одновременно для двусторонней синхронизации между DOM и
внутренним состоянием.@watch позволяет реагировать на изменения этих
свойств.@ref обеспечивает прямой доступ к элементам для
управления DOM при изменениях свойств.Эта комбинация делает FAST Element мощным инструментом для создания реактивных, хорошо структурированных веб-компонентов с минимальным количеством шаблонного кода.