FAST Element — это современная библиотека для создания веб-компонентов на основе стандартов Custom Elements и Shadow DOM, обеспечивающая высокую производительность и гибкую реактивность. Одной из продвинутых возможностей является использование рекурсивных шаблонов, позволяющих строить сложные структуры данных и компонентов с вложенной логикой.
Рекурсивный шаблон — это шаблон, который может включать сам себя внутри своего определения. В контексте FAST Element это обычно используется для отображения иерархических структур, таких как деревья, меню или вложенные списки.
Простейший пример рекурсивного компонента — дерево файловой системы:
import { FASTElement, html, css } from "@microsoft/fast-element";
const treeTemplate = html`
<ul>
${x => x.items.map(item => html`
<li>
${item.name}
${item.children && item.children.length > 0
? html`<tree-view .items=${item.children}></tree-view>`
: ""}
</li>
`)}
</ul>
`;
export class TreeView extends FASTElement {
items = [];
}
TreeView.define({
name: 'tree-view',
template: treeTemplate
});
Ключевые моменты:
.items.FAST Element обеспечивает реактивное обновление DOM, поэтому рекурсивные шаблоны остаются интерактивными при изменении данных. Важно, чтобы данные были отслеживаемыми, иначе изменения не приведут к повторному рендерингу.
import { observable } from "@microsoft/fast-element";
export class TreeView extends FASTElement {
@observable items = [];
}
Использование декоратора @observable гарантирует, что
при добавлении или удалении элементов дерева компонент автоматически
обновит шаблон.
При работе с рекурсивными шаблонами необходимо учитывать глубину вложенности:
Пример с ограничением глубины:
const treeTemplate = html`
<ul>
${x => x.items.map(item => html`
<li>
${item.name}
${item.children && item.children.length > 0 && x.depth < x.maxDepth
? html`<tree-view .items=${item.children} .depth=${x.depth + 1} .maxDepth=${x.maxDepth}></tree-view>`
: ""}
</li>
`)}
</ul>
`;
export class TreeView extends FASTElement {
items = [];
depth = 0;
maxDepth = 5;
}
Рекурсивные шаблоны могут быть дорогими по производительности, если дерево большое. FAST Element предлагает несколько методов оптимизации:
Использование repeat вместо
map Метод repeat позволяет эффективно
обновлять элементы списка без полной перерисовки:
import { repeat } from "@microsoft/fast-element";
const treeTemplate = html`
<ul>
${repeat(x => x.items, html`
<li>
${x => x.name}
${x => x.children && x.children.length > 0 ? html`<tree-view .items=${x => x.children}></tree-view>` : ""}
</li>
`)}
</ul>
`;Ленивая загрузка дочерних элементов Можно отображать дочерние узлы только при раскрытии родителя.
Минимизация вычислений внутри шаблона Все сложные вычисления лучше выполнять в методах класса, а шаблон использовать только для рендеринга.
Рекурсивные компоненты могут требовать передачи событий от дочерних к родительским элементам. В FAST Element для этого используются кастомные события:
// В дочернем элементе
this.$emit('node-selected', { node: this.node });
// В родительском элементе
<tree-view @node-selected=${x => x.onNodeSelected($event)}></tree-view>
.compose() при необходимости.Рекурсивные шаблоны идеально подходят для:
repeat для больших
массивов.Рекурсивные шаблоны в FAST Element открывают широкие возможности для создания сложных и динамических интерфейсов, оставаясь при этом легковесными и высокопроизводительными благодаря реактивной модели и эффективному DOM-обновлению.