FAST Element — это библиотека для создания Web Components с акцентом на декларативность, реактивность и расширяемость. Одной из ключевых особенностей является система встроенных поведений (built-in behaviors), которая позволяет интегрировать повторно используемую функциональность в компоненты без дублирования кода. Поведения обеспечивают связь между свойствами компонента, событиями DOM и логикой пользовательского интерфейса.
Поведение в FAST Element — это объект или класс, который может быть привязан к элементу и реагировать на изменения состояния, событий или атрибутов. Оно не создает отдельного DOM, но влияет на существующий элемент, управляя его поведением.
Ключевые аспекты:
В FAST Element поведение обычно реализуется как объект с методами:
import { attr, FASTElement } from "@microsoft/fast-element";
export const FocusBehavior = {
bind(element) {
element.addEventListener("focus", this.onFocus);
element.addEventListener("blur", this.onBlur);
},
unbind(element) {
element.removeEventListener("focus", this.onFocus);
element.removeEventListener("blur", this.onBlur);
},
onFocus() {
this.classList.add("focused");
},
onBlur() {
this.classList.remove("focused");
}
};
Объяснение ключевых методов:
bind(element) — вызывается при подключении поведения к
элементу. Здесь обычно регистрируются слушатели событий или
инициализируются начальные состояния.unbind(element) — вызывается при отключении поведения.
Очищает ресурсы, снимает слушатели событий.onFocus, onBlur)
реализуют конкретную функциональность, связанную с поведением.Поведения можно подключать к компонентам через директиву
behavior в шаблоне:
import { html, FASTElement, behavior } from "@microsoft/fast-element";
import { FocusBehavior } from "./behaviors";
class MyButton extends FASTElement {}
const template = html<MyButton>`
<button ${behavior(FocusBehavior)}>Нажми меня</button>
`;
MyButton.define({ name: "my-button", template });
Здесь директива ${behavior(FocusBehavior)} автоматически
вызывает методы bind и unbind, когда элемент
добавляется или удаляется из DOM.
disabled и состояния кнопки.Каждое поведение может быть дополнено реактивными свойствами FAST Element для синхронизации данных с DOM.
Поведения могут использовать реактивные свойства элемента:
import { observable } from "@microsoft/fast-element";
export const ToggleBehavior = {
bind(element) {
element.toggle = false;
},
toggleState(element) {
element.toggle = !element.toggle;
}
};
class MyToggle extends FASTElement {
@observable toggle = false;
}
const template = html<MyToggle>`
<div ${behavior(ToggleBehavior)} @click="${x => x.toggleState(x)}">
${x => x.toggle ? "Включено" : "Выключено"}
</div>
`;
В этом примере поведение ToggleBehavior использует
реактивное свойство toggle, обеспечивая синхронизацию
состояния и представления без ручной работы с DOM.
FAST Element позволяет комбинировать несколько поведений на одном элементе:
const template = html<MyButton>`
<button
${behavior(FocusBehavior)}
${behavior(HoverBehavior)}
${behavior(DisabledBehavior)}
>
Комбинированная кнопка
</button>
`;
Порядок подключения важен только в случае, если поведения конфликтуют
при обработке одних и тех же событий. В противном случае все методы
bind вызываются последовательно.
Поведение можно расширять через наследование или композицию:
export const AnimatedFocusBehavior = {
...FocusBehavior,
onFocus() {
FocusBehavior.onFocus.call(this);
this.style.transition = "all 0.3s ease";
}
};
Такой подход позволяет создавать специализированные версии стандартных поведений без дублирования базовой логики.
unbind для предотвращения утечек
памяти.Встроенные поведения в FAST Element — мощный инструмент для построения масштабируемых Web Components. Они обеспечивают чистую архитектуру, повышают повторное использование кода и позволяют управлять реактивным состоянием элементов без лишней сложности.