В FAST Element поведение компонентов определяется через custom elements, которые наследуют возможности стандартного Web Components API, но предоставляют расширенный контроль над жизненным циклом и реактивностью. Основное понятие — поведение (behavior) — представляет собой механизм, позволяющий управлять жизненным циклом элемента, его состоянием и реакцией на изменения свойств и атрибутов.
Поведение в FAST Element описывается с помощью классов, расширяющих
FASTElement:
import { FASTElement, html, css } from "@microsoft/fast-element";
class MyElement extends FASTElement {
firstName = "John";
lastName = "Doe";
get fullName() {
return `${this.firstName} ${this.lastName}`;
}
}
MyElement.define({
name: "my-element",
template: html`<div>${x => x.fullName}</div>`,
styles: css`div { font-weight: bold; }`
});
Ключевые моменты:
FASTElement предоставляет базовую инфраструктуру
реактивности и связывания данных.FAST Element добавляет дополнительные хуки жизненного цикла поверх стандартных:
connectedCallback() Вызывается при
добавлении элемента в DOM. На этом этапе можно инициализировать события,
подписки или динамическую загрузку данных.
connectedCallback() {
super.connectedCallback();
console.log("Элемент подключён к DOM");
}disconnectedCallback() Вызывается
при удалении элемента из DOM. Подходит для очистки ресурсов, отписки от
событий и остановки таймеров.
disconnectedCallback() {
console.log("Элемент удалён из DOM");
super.disconnectedCallback();
}attributeChangedCallback(name, oldValue, newValue)
Триггерится при изменении отслеживаемых атрибутов. FAST Element
автоматически связывает свойства с атрибутами при их объявлении.
attributeChangedCallback(name, oldValue, newValue) {
console.log(`${name} изменён с ${oldValue} на ${newValue}`);
super.attributeChangedCallback(name, oldValue, newValue);
}propertyChanged(propertyName, oldValue, newValue)
Специфический FAST Element метод, вызывается при изменении реактивного
свойства. Он позволяет обновлять DOM или выполнять побочные эффекты без
необходимости вручную отслеживать атрибуты.
propertyChanged(propertyName, oldValue, newValue) {
if(propertyName === "firstName") {
console.log(`firstName изменён на ${newValue}`);
}
super.propertyChanged(propertyName, oldValue, newValue);
}FAST Element поддерживает реактивное связывание данных через декораторы и объявление свойств:
import { observable } from "@microsoft/fast-element";
class UserCard extends FASTElement {
@observable firstName;
@observable lastName;
get fullName() {
return `${this.firstName} ${this.lastName}`;
}
}
@observable делает свойство реактивным. Любое
изменение автоматически вызовет обновление DOM в местах, где оно
связано.FAST Element позволяет разделять структуру и стили через
template и styles:
import { html, css } from "@microsoft/fast-element";
const template = html<UserCard>`<div>${x => x.fullName}</div>`;
const styles = css`div { color: blue; font-size: 16px; }`;
UserCard.define({
name: "user-card",
template,
styles
});
Поведения элементов тесно связаны с событиями:
class ClickCounter extends FASTElement {
count = 0;
increment() {
this.count++;
}
}
const template = html<ClickCounter>`
<button @click="${x => x.increment()}">Нажато: ${x => x.count}</button>
`;
ClickCounter.define({ name: "click-counter", template });
@click — это директива FAST Element для привязки
событий.count автоматически обновляет
текст внутри кнопки.Directive и
BehaviorFAST Element поддерживает более гибкие способы управления поведением через Directives:
ref — позволяет сохранять ссылку на
элемент или DOM-узел.repeat — реактивно повторяет элементы
на основе массива.when — условное отображение
элементов.Пример использования ref для управления элементом:
import { ref } from "@microsoft/fast-element";
const template = html`<input ${ref("inputElement")}>`;
class InputFocus extends FASTElement {
inputElement;
connectedCallback() {
super.connectedCallback();
this.inputElement.focus();
}
}
InputFocus.define({ name: "input-focus", template });
ref связывает DOM-узел с полем класса.connectedCallback можно выполнить действия над
элементом сразу после вставки в DOM.Один элемент может иметь несколько поведений, объединяя их через композицию и наследование:
class LoggingBehavior extends FASTElement {
logPropertyChange(name, value) {
console.log(`Свойство ${name} изменено на ${value}`);
}
}
class MyComponent extends LoggingBehavior {
myProperty;
propertyChanged(name, oldValue, newValue) {
super.propertyChanged(name, oldValue, newValue);
this.logPropertyChange(name, newValue);
}
}
MyComponent.define({ name: "my-component" });
super позволяет сохранять функциональность
родителя и добавлять новые реакции.connectedCallback)
— инициализация событий и ресурсов.propertyChanged /
attributeChangedCallback).disconnectedCallback)
— очистка ресурсов.Эта последовательность позволяет строить высокореактивные, модульные и управляемые компоненты, полностью интегрированные в систему FAST Element.