FAST Element — это современная библиотека для создания Web Components с использованием чистого JavaScript. Она предоставляет инструменты для декларативного описания компонентов, реактивного обновления DOM и строгой типизации свойств.
Компонент создается через класс, наследующий
FASTElement. Основные элементы структуры:
import { FASTElement, html, css } from "@microsoft/fast-element";
const template = html`
<template>
<h1>${x => x.title}</h1>
<p>${x => x.content}</p>
</template>
`;
const styles = css`
h1 { color: #0078d4; }
p { font-size: 16px; }
`;
export class MyComponent extends FASTElement {
title = "Заголовок компонента";
content = "Текст компонента";
}
MyComponent.define({
name: "my-component",
template,
styles
});
Ключевые моменты:
FASTElement обеспечивает реактивность свойств.html используется для декларативного описания
шаблона.css применяет стили локально к компоненту.define регистрирует компонент в браузере.Свойства компонентов автоматически отслеживаются библиотекой. Изменение значения свойства вызывает обновление DOM.
export class CounterComponent extends FASTElement {
count = 0;
increment() {
this.count++;
}
}
${x => x.count} в шаблоне позволяет
динамически отображать значение.@observable.import { observable } from "@microsoft/fast-element";
export class CounterComponent extends FASTElement {
@observable count = 0;
}
FAST Element поддерживает несколько видов привязки:
Односторонняя привязка: от свойства к DOM.
Пример: ${x => x.title}.
Двусторонняя привязка: синхронизация значения
между компонентом и элементом формы. Используется
:value="${x => x.inputValue}" с событием
input.
Условная отрисовка: директива
when.
import { when } from "@microsoft/fast-element";
const template = html`
<template>
${when(x => x.showText, html`<p>Текст отображается</p>`)}
</template>
`;
repeat.import { repeat } from "@microsoft/fast-element";
const template = html`
<template>
<ul>
${repeat(x => x.items, html`<li>${x => x}</li>`)}
</ul>
</template>
`;
Стили FAST Element изолированы и применяются только к конкретному компоненту. Использование CSS-переменных позволяет создавать настраиваемые темы.
const styles = css`
:host {
display: block;
padding: 10px;
background-color: var(--component-bg, #f0f0f0);
}
h1 { color: var(--component-title-color, #222); }
`;
:host применяется к корневому элементу компонента.Компоненты могут создавать и обрабатывать события:
export class ButtonComponent extends FASTElement {
handleClick() {
this.$emit("button-clicked", { timestamp: Date.now() });
}
}
const template = html`
<template>
<button @click="${x => x.handleClick()}">Нажми меня</button>
</template>
`;
$emit позволяет компоненту отправлять кастомные
события.@ перед событием в шаблоне связывает обработчик
с DOM-событием.FAST Element предоставляет хуки жизненного цикла:
connectedCallback() — вызывается при добавлении
компонента в DOM.disconnectedCallback() — при удалении компонента.propertyChanged(name, oldValue, newValue) — при
изменении наблюдаемого свойства.Пример:
export class LifecycleComponent extends FASTElement {
connectedCallback() {
super.connectedCallback();
console.log("Компонент добавлен в DOM");
}
disconnectedCallback() {
super.disconnectedCallback();
console.log("Компонент удален из DOM");
}
}
Компоненты FAST Element легко комбинируются между собой:
const template = html`
<template>
<my-component title="Первый" content="Описание 1"></my-component>
<my-component title="Второй" content="Описание 2"></my-component>
</template>
`;
FAST Element можно интегрировать с Svelte через обычное использование Web Components. Компоненты FAST объявляются как кастомные элементы и используются в Svelte-шаблоне напрямую:
<script>
import "my-component.js";
</script>
<my-component title="Пример Svelte" content="Использование FAST Element"></my-component>
FAST Element поддерживает расширение через директивы и контейнеры поведения:
attr, class, style — для
динамического изменения атрибутов и классов.FAST Element сочетает в себе реактивность, модульность и строгую типизацию, обеспечивая мощный инструмент для создания Web Components, совместимых с современными фреймворками, включая Svelte.