FAST Element — это библиотека для создания веб-компонентов на базе стандартов Web Components, предоставляющая мощные возможности для построения сложных и повторно используемых интерфейсов. Одним из ключевых инструментов в разработке масштабных приложений являются композитные компоненты, которые позволяют объединять несколько компонентов в один логический блок, сохраняя управляемость состояния и гибкость стилизации.
Композитный компонент в FAST Element — это компонент, который состоит из одного или нескольких дочерних компонентов, взаимодействующих между собой через свойства, события и слоты. Основные особенности:
Для создания композитного компонента используются классы,
наследуемые от FASTElement, а также директивы и
шаблоны FAST.
Пример структуры простого композитного компонента:
import { FASTElement, html, css } from "@microsoft/fast-element";
import "./button.js";
import "./input.js";
const template = html`
<div class="composite-container">
<my-input value="${x => x.inputValue}" @input="${x => x.onInput()}"></my-input>
<my-button @click="${x => x.onSubmit()}">Отправить</my-button>
</div>
`;
const styles = css`
.composite-container {
display: flex;
gap: 10px;
align-items: center;
}
`;
export class FormComponent extends FASTElement {
inputValue = "";
onInput(event) {
this.inputValue = event.target.value;
}
onSubmit() {
console.log("Отправлено значение:", this.inputValue);
}
}
FormComponent.define({
name: "form-component",
template,
styles
});
В этом примере FormComponent объединяет
my-input и my-button, обрабатывая события и
связывая состояние между ними.
Композитные компоненты в FAST Element реализуют двунаправленное взаимодействие через:
Пример передачи данных через свойства и события:
<child-component
.value="${parentValue}"
@value-changed="${x => x.handleChildChange()}">
</child-component>
Здесь parentValue передается дочернему компоненту, а
любое изменение значения инициирует событие value-changed,
которое обрабатывает родитель.
Слоты позволяют создавать гибкие шаблоны и передавать внутренний контент при использовании компонента.
Пример композитного компонента с именованными слотами:
const template = html`
<div class="card">
<header><slot name="header"></slot></header>
<main><slot></slot></main>
<footer><slot name="footer"></slot></footer>
</div>
`;
export class CardComponent extends FASTElement {}
CardComponent.define({
name: "card-component",
template
});
Использование:
<card-component>
<h1 slot="header">Заголовок</h1>
<p>Основной контент</p>
<button slot="footer">Действие</button>
</card-component>
Такой подход делает компонент максимально гибким и настраиваемым.
FAST Element предоставляет реактивные свойства, которые автоматически обновляют DOM при изменении состояния. Это особенно полезно для композитных компонентов, где несколько дочерних компонентов зависят от общего состояния.
Пример реактивного свойства:
import { observable } from "@microsoft/fast-element";
export class CounterComponent extends FASTElement {
@observable count = 0;
increment() {
this.count += 1;
}
}
Изменение count автоматически обновит все привязки в
шаблоне, где используется это свойство.
При создании сложных UI с множеством дочерних компонентов стоит придерживаться нескольких принципов:
FAST поддерживает директивы, упрощающие управление состоянием внутри шаблонов:
repeat — для генерации списков.if — условный рендеринг.ref — получение ссылки на DOM-элемент или дочерний
компонент.when — сложные условия отображения.Пример с директивой repeat:
const template = html`
<ul>
${repeat(x => x.items, html`<li>${x => x}</li>`)}
</ul>
`;
Это позволяет композитному компоненту динамически отображать списки без ручного манипулирования DOM.
Для сложных приложений важно синхронизировать состояние между компонентами:
Store или
реактивные объекты.Такой подход обеспечивает масштабируемость и предсказуемое поведение даже в больших приложениях.
Композитные компоненты FAST Element позволяют создавать структурированные, гибкие и повторно используемые интерфейсы, управляя как логикой, так и стилями компонентов на высоком уровне абстракции. Благодаря реактивности, слотам и событиям, они становятся основой для построения сложных пользовательских интерфейсов, поддерживая чистую архитектуру и модульность кода.