FAST Element — это современная библиотека для разработки веб-компонентов с использованием стандартов Web Components и реактивного связывания данных. Основной единицей в FAST является custom element, который можно создавать, настраивать и использовать так же, как стандартные HTML-теги.
Для создания пользовательского элемента используется класс,
наследующийся от FASTElement. Класс должен быть
зарегистрирован с помощью функции customElements.define или
через FASTElement.define.
Пример базового элемента формы:
import { FASTElement, html, css } from "@microsoft/fast-element";
const template = html<MyInputElement>`
<label>${x => x.label}</label>
<input type="text" value="${x => x.value}" @input="${x => x.handleInput()}"/>
`;
const styles = css`
label {
display: block;
font-weight: bold;
margin-bottom: 4px;
}
input {
padding: 6px 8px;
border: 1px solid #ccc;
border-radius: 4px;
}
`;
export class MyInputElement extends FASTElement {
value = "";
label = "Поле ввода";
handleInput(event) {
this.value = event.target.value;
}
}
FASTElement.define({
name: "my-input",
template,
styles,
elementClass: MyInputElement
});
Ключевые моменты:
template) создаётся с
использованием функции html и поддерживает привязку данных
через стрелочные функции.css) применяются локально к
элементу и не влияют на глобальные стили.@event="${x => x.method()}".${x => x.property}.FAST Element поддерживает реактивные свойства, которые автоматически
обновляют DOM при изменении значения. Для реактивных свойств
используется @observable или декларация свойств внутри
класса.
Пример реактивного свойства:
import { FASTElement, html, observable } from "@microsoft/fast-element";
class MyCheckbox extends FASTElement {
@observable checked = false;
}
checked автоматически обновит все привязки в
шаблоне.Для сложных форм удобно объединять несколько элементов в один контейнер:
const formTemplate = html<MyFormElement>`
<form @submit="${x => x.handleSubmit()}">
<my-input label="Имя" value="${x => x.name}"></my-input>
<my-input label="Email" value="${x => x.email}"></my-input>
<button type="submit">Отправить</button>
</form>
`;
class MyFormElement extends FASTElement {
name = "";
email = "";
handleSubmit(event) {
event.preventDefault();
console.log("Данные формы:", { name: this.name, email: this.email });
}
}
FASTElement.define({
name: "my-form",
template: formTemplate,
elementClass: MyFormElement
});
Особенности:
FAST Element поддерживает генерацию коллекций с помощью директив
repeat:
import { repeat } from "@microsoft/fast-element";
const todoTemplate = html<MyTodoList>`
<ul>
${repeat(x => x.items, html<TodoItem>`
<li>${x => x.text}</li>
`)}
</ul>
`;
class MyTodoList extends FASTElement {
items = [{ text: "Сделать урок" }, { text: "Проверить почту" }];
}
FASTElement.define({
name: "my-todo-list",
template: todoTemplate,
elementClass: MyTodoList
});
repeat позволяет создавать списки с реактивными
данными.FAST Element позволяет синхронизировать свойства класса с атрибутами
HTML через @attr:
import { FASTElement, attr } from "@microsoft/fast-element";
class MyButton extends FASTElement {
@attr type = "button"; // Атрибут type синхронизирован с классом
}
FASTElement.define({
name: "my-button",
template: html<MyButton>`<button type="${x => x.type}"><slot></slot></button>`,
elementClass: MyButton
});
type через HTML автоматически
обновляет свойство type в классе.Для гибкой кастомизации формы используется
<slot>:
const cardTemplate = html<MyCard>`
<div class="card">
<slot name="header"></slot>
<slot></slot>
</div>
`;
class MyCard extends FASTElement {}
FASTElement.define({
name: "my-card",
template: cardTemplate,
elementClass: MyCard
});
name="header") для
заголовков или боковых панелей.Использование FAST Element позволяет создавать полностью реактивные, настраиваемые и модульные формы с минимальной зависимостью от сторонних библиотек. Библиотека обеспечивает:
repeat, when) для
динамических интерфейсов.Эти возможности делают FAST Element оптимальным инструментом для сложных пользовательских форм в современных веб-приложениях.