FAST Element — это библиотека для создания веб-компонентов с реактивным состоянием и эффективным связыванием данных. Одной из мощных возможностей является использование именованных слотов, которые позволяют компоновать сложные интерфейсы и задавать контент в определённых областях компонента.
В HTML слоты — это специальные точки вставки для внешнего контента в
шаблоне компонента. Именованный слот отличается тем,
что ему присваивается уникальное имя через атрибут name.
Контент, переданный в слот с соответствующим атрибутом
slot, будет отображаться именно в этом месте.
Пример базового слота:
<template>
<slot name="header"></slot>
<div>Основной контент</div>
<slot name="footer"></slot>
</template>
Использование в HTML:
<my-component>
<h1 slot="header">Заголовок</h1>
<p>Текст основного контента</p>
<footer slot="footer">Подвал</footer>
</my-component>
В этом примере <h1> попадёт в слот
header, а <footer> — в
footer. Контент без указания slot не будет
вставлен в именованные слоты.
В FAST Element шаблон компонента создаётся через
функцию html. Именованные слоты оформляются с помощью
slot с атрибутом name.
import { FASTElement, html, css } from "@microsoft/fast-element";
const template = html<MyComponent>`
<header>
<slot name="header"></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
`;
const styles = css`
header { background: #f0f0f0; padding: 10px; }
footer { background: #f0f0f0; padding: 10px; }
`;
export class MyComponent extends FASTElement {}
MyComponent.define({ name: "my-component", template, styles });
Здесь <slot></slot> без имени служит
слотом по умолчанию, в который попадёт весь контент без
атрибута slot.
Чёткая структура компонента Именованные слоты позволяют заранее определить, где именно должен отображаться контент разного типа: заголовки, кнопки действий, подвал.
Гибкость при повторном использовании Один и тот
же компонент может использоваться с разными комбинациями контента,
просто изменяя вложенные элементы с атрибутом
slot.
Изоляция контента Слоты отделяют шаблон компонента от внешнего контента, предотвращая вмешательство в структуру DOM.
FAST Element обеспечивает реактивное обновление контента слотов. Если содержимое слота изменяется после рендеринга, компонент автоматически обновляет отображение. Это особенно полезно при динамическом изменении интерфейса.
Пример динамического слота:
import { FASTElement, html, observable } from "@microsoft/fast-element";
class DynamicComponent extends FASTElement {
@observable headerText = "Первоначальный заголовок";
}
const template = html<DynamicComponent>`
<header>
<slot name="header">${x => x.headerText}</slot>
</header>
`;
DynamicComponent.define({ name: "dynamic-component", template });
Изменение headerText обновит содержимое слота без
перерисовки всего компонента.
Именованные слоты могут иметь fallback-контент, который отображается, если внешний контент для слота не передан.
<slot name="header">Заголовок по умолчанию</slot>
Если при использовании компонента не передан элемент с
slot="header", отображается текст
Заголовок по умолчанию.
Можно комбинировать именованные и дефолтные слоты, а также создавать вложенные компоненты с собственными слотами. Это позволяет строить сложные интерфейсы с многоуровневой структурой.
<parent-component>
<child-component slot="content">
<p slot="header">Вложенный заголовок</p>
</child-component>
</parent-component>
Такой подход упрощает организацию компонентов и поддерживает композицию интерфейсов, где каждый элемент управляет своим собственным слотом.
FAST Element позволяет реагировать на изменения в слотах через
событие slotchange. Оно вызывается каждый раз, когда
содержимое слота обновляется.
const slot = this.shadowRoot.querySelector('slot[name="header"]');
slot.addEventListener('slotchange', () => {
console.log("Содержимое слота обновлено:", slot.assignedNodes());
});
Метод assignedNodes() возвращает список узлов,
переданных в слот, включая текстовые и элементные узлы.
Именованные слоты в FAST Element обеспечивают точное позиционирование и динамическое управление контентом, что делает их незаменимым инструментом при создании гибких, переиспользуемых веб-компонентов. Они поддерживают реактивность, fallback-контент и событийное взаимодействие, что значительно упрощает построение сложных интерфейсов.