HTML Templates — это механизм для создания шаблонов в веб-страницах. Они позволяют определять HTML-код, который не будет сразу отображаться на странице, а будет использоваться в будущем с помощью JavaScript. Это может быть полезно для создания динамических интерфейсов, рендеринга контента и повторного использования кода.
В Stencil поддержка шаблонов обеспечивается через стандартный
механизм <template>, который является частью
спецификации HTML5. С помощью этого элемента можно объявить структуру
DOM, которая будет вставляться в DOM-дерево страницы, когда это
потребуется.
Для Stencil использование шаблонов не ограничивается только объявлениями элементов, но и интеграцией с реактивностью и компонентами, что позволяет создавать эффективные и легко поддерживаемые веб-приложения.
Stencil использует подход, похожий на стандартный механизм шаблонов в веб-компонентах, где для определения структуры компонента применяется HTML-шаблон. Структура компонента определяется в классе, а сам шаблон размещается в HTML-разметке.
Пример простого компонента с использованием шаблона:
import { Component, h } from '@stencil/core';
@Component({
tag: 'my-component',
shadow: true
})
export class MyComponent {
render() {
return (
<div>
<h1>Hello, Stencil!</h1>
<p>Welcome to the world of Web Components.</p>
</div>
);
}
}
В данном примере используется JSX-синтаксис для рендеринга HTML, что
является стандартной практикой для Stencil. Шаблон компонента описан
внутри метода render(). При этом в Stencil доступна
реактивность, так что изменения в состоянии компонента автоматически
обновляют представление.
Слоты (slots) в Stencil — это механизм для вставки произвольного
контента в компоненты. Это функциональность, аналогичная встроенному
тегу <slot> в веб-компонентах. С помощью слотов можно
вставлять динамический контент в компоненты без необходимости изменять
их внутреннюю реализацию.
Слоты представляют собой места, куда можно вставлять HTML-контент, когда компонент используется. В Stencil слоты позволяют пользователю компонента задавать часть разметки, которую он хочет отобразить в определенном месте внутри компонента.
Слоты полезны в случаях, когда необходимо создать компонент, который будет обрабатывать данные или стили, но будет зависеть от внешнего контента. Пример использования слота:
import { Component, h } from '@stencil/core';
@Component({
tag: 'my-card',
shadow: true
})
export class MyCard {
render() {
return (
<div class="card">
<header>
<slot name="header"></slot>
</header>
<main>
<slot></slot> {/* Дефолтный слот */}
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>
);
}
}
В этом примере компонент my-card использует три слота:
один для шапки, один для основного контента и один для подвала.
Пользователь компонента может вставить контент в эти слоты при
использовании компонента:
<my-card>
<div slot="header">Заголовок</div>
<p>Основной текст карточки.</p>
<div slot="footer">Подвал карточки</div>
</my-card>
Слоты бывают двух типов: дефолтные и именованные.
В приведенном выше примере слот без имени является дефолтным, а два
других — именованными. Для использования именованного слота контент
должен быть связан с конкретным именем слота через атрибут
slot.
Stencil позволяет работать с несколькими слотами в одном компоненте, что делает его удобным для создания сложных интерфейсов, где требуется разделение контента на разные части.
Пример:
import { Component, h } from '@stencil/core';
@Component({
tag: 'my-modal',
shadow: true
})
export class MyModal {
render() {
return (
<div class="modal">
<header>
<slot name="header"></slot>
</header>
<div class="content">
<slot></slot> {/* Основной контент */}
</div>
<footer>
<slot name="footer"></slot>
</footer>
</div>
);
}
}
Этот компонент модального окна использует три слота, и при его использовании можно вставить контент в нужные области:
<my-modal>
<div slot="header">Заголовок модального окна</div>
<p>Основной текст модального окна.</p>
<div slot="footer">
<button>Закрыть</button>
</div>
</my-modal>
В данном примере, помимо вставки текста в дефолтный слот, контент для шапки и подвала вставляется в именованные слоты.
HTML-шаблоны и слоты в Stencil играют ключевую роль в создании гибких и динамичных компонентов. Шаблоны позволяют определять структуру, которая будет повторно использована, а слоты — вставлять динамический контент, не нарушая архитектуру компонента. Это делает Stencil отличным инструментом для разработки масштабируемых и высокоэффективных веб-приложений.