Компоненты высшего порядка (Higher-Order Components, HOC) в контексте FAST Element — это функции, которые принимают один компонент и возвращают новый компонент с расширенным функционалом или изменённым поведением. Этот подход позволяет повторно использовать логику, отделяя её от конкретной реализации визуального интерфейса.
Чистота функции HOC всегда реализуется как чистая функция. Она не должна напрямую изменять входной компонент, а должна возвращать новый, расширенный компонент.
import { FASTElement } from "@microsoft/fast-element";
function withLogger(BaseComponent) {
return class extends BaseComponent {
connectedCallback() {
super.connectedCallback();
console.log(`${this.tagName} подключён к DOM`);
}
}
}Композиция вместо наследования Хотя в примере выше используется наследование, основной акцент делается на возможность добавлять функциональность через композицию, оставляя оригинальный компонент неизменным.
Передача пропсов Все свойства оригинального компонента должны корректно передаваться через HOC, чтобы не нарушать его интерфейс.
function withPrefix(BaseComponent, prefix = "app-") {
return class extends BaseComponent {
constructor() {
super();
this.prefix = prefix;
}
get prefixedId() {
return `${this.prefix}${this.id || "default"}`;
}
}
}Логирование событий и жизненного цикла Часто требуется отслеживать подключение и отключение компонента от DOM. HOC позволяет внедрить такие механизмы централизованно, не модифицируя каждый компонент.
const LoggedButton = withLogger(FASTElement.define({
name: "my-button",
template: `<button><slot></slot></button>`
}));Добавление общих методов и свойств Например, HOC может внедрять метод для работы с локальным состоянием или кэшированием данных. Это снижает дублирование кода в разных компонентах.
Обработка атрибутов и реактивности HOC можно использовать для автоматической привязки атрибутов к свойствам с предобработкой данных.
function withDefaultAttributes(BaseComponent, defaults) {
return class extends BaseComponent {
constructor() {
super();
Object.entries(defaults).forEach(([key, value]) => {
if (!this.hasOwnProperty(key)) {
this[key] = value;
}
});
}
}
}import { FASTElement, html, css } from "@microsoft/fast-element";
function withEnhancedBehavior(BaseComponent) {
return class extends BaseComponent {
connectedCallback() {
super.connectedCallback();
this.addEventListener('click', this.handleClick);
}
disconnectedCallback() {
super.disconnectedCallback();
this.removeEventListener('click', this.handleClick);
}
handleClick = (event) => {
console.log(`Элемент ${this.tagName} был нажат`);
}
}
}
const TemplateComponent = FASTElement.define({
name: 'my-template',
template: html`<button><slot></slot></button>`
});
const EnhancedComponent = withEnhancedBehavior(TemplateComponent);
В этом примере HOC добавляет обработку событий клика, сохраняя при этом оригинальный шаблон компонента.
Использование HOC в FAST Element позволяет:
Ключевой момент — строгая разделённость логики и визуальной реализации, что соответствует философии FAST Element: лёгкие, реактивные и настраиваемые веб-компоненты.