FAST Element — это современный фреймворк для создания веб-компонентов на основе стандартов Web Components. Одним из ключевых принципов при работе с FAST является разделение ответственности, что позволяет создавать масштабируемые, поддерживаемые и легко тестируемые компоненты.
Компонент FAST Element строится на трёх основных уровнях: логика, шаблон и стили.
Логика компонента (Class) Класс компонента
наследует FASTElement и определяет реактивные свойства и
методы. Пример:
import { FASTElement, html, css, customElement } from "@microsoft/fast-element";
@customElement({ name: "user-card", template: UserCard.template, styles: UserCard.styles })
class UserCard extends FASTElement {
firstName;
lastName;
get fullName() {
return `${this.firstName} ${this.lastName}`;
}
greet() {
console.log(`Привет, ${this.fullName}`);
}
}
Важный аспект: класс отвечает только за состояние и поведение, но не за разметку и стили.
Шаблон (HTML) Шаблон создаётся с помощью функции
html и содержит привязки к свойствам класса. Пример:
UserCard.template = html<UserCard>`
<div class="card">
<h2>${x => x.fullName}</h2>
<button @click="${x => x.greet()}">Поздороваться</button>
</div>
`;
Здесь шаблон только отображает данные и связывает события с методами класса, не вмешиваясь в логику компонентов.
Стили (CSS) Стили определяются через функцию
css и применяются к шаблону. Пример:
UserCard.styles = css`
.card {
border: 1px solid #ccc;
padding: 16px;
border-radius: 8px;
}
button {
background-color: #0078d4;
color: white;
border: none;
padding: 8px 12px;
cursor: pointer;
}
`;
Стили должны отдельно отвечать за визуальное оформление, не влияя на состояние и методы класса.
FAST Element использует реактивную систему свойств, которая автоматически обновляет DOM при изменении значений. Для корректного разделения ответственности свойства должны быть:
Пример реактивного свойства:
import { observable } from "@microsoft/fast-element";
class UserCard extends FASTElement {
@observable firstName;
@observable lastName;
}
Изменение firstName автоматически обновляет
соответствующие места в шаблоне.
События должны быть частью поведения компонента, а не его шаблона. Для разделения ответственности используется делегирование:
@click
или @change.this.$emit.Пример:
greet() {
const message = `Привет, ${this.fullName}`;
this.$emit("greet", { detail: message });
}
Шаблон не знает о реализации greet — он только вызывает
привязанный метод.
FAST Element поддерживает композицию компонентов, что усиливает разделение ответственности:
UserCard).UserList), используя UserCard внутри
себя.const userListTemplate = html<UserList>`
<div>
${x => x.users.map(user => html`<user-card first-name="${user.firstName}" last-name="${user.lastName}"></user-card>`)}
</div>
`;
Каждый компонент отвечает только за свою часть интерфейса и поведения, что облегчает тестирование и поддержку.
properties,
observable) должно быть локализовано в компоненте и
управляться только через него.FAST Element поддерживает Shadow DOM, что позволяет изолировать стили:
UserCard.shadowOptions = { mode: "open" };
Директивы FAST (repeat, if,
ref) позволяют:
Пример директивы repeat:
<ul>
${x => x.items.map(item => html`<li>${item}</li>`)}
</ul>
Разделение ответственности в FAST Element создаёт чистую архитектуру: логика, шаблон, стили, события и состояние строго разграничены. Такой подход упрощает масштабирование, тестирование и сопровождение веб-приложений.