Для использования компонента в HTML необходимо сначала создать сам компонент с помощью фреймворка Stencil. Компонент Stencil представляет собой пользовательский элемент, который может быть использован на любой веб-странице, независимо от того, какой фреймворк или библиотеку использует проект. Основной принцип работы с компонентами Stencil заключается в создании классов, которые расширяют возможности стандартных HTML-элементов.
Компоненты Stencil обладают всеми характеристиками обычных веб-компонентов: они инкапсулируют свой функционал, поддерживают работу с состоянием, могут иметь свойства, методы и события.
Компонент Stencil создается в виде класса, который использует
декораторы, такие как @Component, для указания метаданных
компонента. Основные атрибуты компонента:
@Component — определяет метаданные
компонента, такие как имя элемента, путь к стилям, и другие
настройки.@Prop — используется для создания
публичных свойств компонента.@State — создает внутренние состояния
компонента.@Method — позволяет объявить публичные
методы компонента.Пример простого компонента:
import { Component, h, Prop } from '@stencil/core';
@Component({
tag: 'my-greeting',
styleUrl: 'my-greeting.css',
shadow: true
})
export class MyGreeting {
@Prop() name: string;
render() {
return <div>Hello, {this.name}!</div>;
}
}
В этом примере компонент my-greeting выводит
приветственное сообщение с именем, переданным через атрибут
name.
После того как компонент создан, его необходимо интегрировать в HTML-страницу. Для этого нужно подключить скомпилированные файлы компонентов, созданные с помощью Stencil, и использовать сам компонент как обычный HTML-элемент.
<script type="module" src="/build/my-component.js"></script>
<my-greeting name="Alice"></my-greeting>
При этом компонент my-greeting будет рендерить в
браузере сообщение “Hello, Alice!”.
Компоненты Stencil можно сделать более гибкими и многоразовыми, предоставляя им различные способы настройки через свойства и атрибуты.
name в примере выше, передаются
как свойства компонента через декоратор @Prop. Важным
моментом является то, что изменения значений атрибутов автоматически
приводят к перерендеру компонента.<my-greeting name="Bob"></my-greeting>
@Component({
tag: 'my-card',
styleUrl: 'my-card.css',
shadow: true
})
export class MyCard {
render() {
return (
<div class="card">
<slot></slot>
</div>
);
}
}
Теперь можно передавать в этот компонент произвольный контент:
<my-card>
<h1>Заголовок карточки</h1>
<p>Описание карточки</p>
</my-card>
Компоненты Stencil поддерживают собственные события, которые могут быть использованы для общения с родительским элементом или другими частями приложения.
События могут быть переданы через декоратор @Event, а их
использование включает в себя создание и привязку обработчиков в
родительском компоненте.
Пример компонента с событием:
import { Component, Event, EventEmitter, h } from '@stencil/core';
@Component({
tag: 'my-button',
styleUrl: 'my-button.css',
shadow: true
})
export class MyButton {
@Event() clicked: EventEmitter;
handleClick() {
this.clicked.emit('Button clicked!');
}
render() {
return <button onCl ick={() => this.handleClick()}>Click me</button>;
}
}
В родительском компоненте или на странице можно привязать обработчик события:
<my-button onClic ked="alert(event.detail)"></my-button>
В этом примере, при клике на кнопку, будет выведено сообщение с данными, переданными в событии.
Stencil позволяет условно рендерить части компонента в зависимости от состояния. Это можно использовать для динамического обновления контента в зависимости от состояния компонента.
Пример использования условия для рендеринга:
@Component({
tag: 'my-toggle',
styleUrl: 'my-toggle.css',
shadow: true
})
export class MyToggle {
@State() isVisible: boolean = false;
toggleVisibility() {
this.isVisible = !this.isVisible;
}
render() {
return (
<div>
<button onCl ick={() => this.toggleVisibility()}>
Toggle
</button>
{this.isVisible && <p>Content is now visible!</p>}
</div>
);
}
}
В этом примере кнопка переключает видимость текста в зависимости от
состояния isVisible.
Stencil поддерживает использование кастомных стилей для компонентов через файл CSS или SASS, а также загрузку шрифтов и других ресурсов. Стили могут быть инкапсулированы в компоненте (через Shadow DOM) или глобальными.
@Component({
tag: 'my-card',
styleUrl: 'my-card.css',
shadow: true
})
export class MyCard {
render() {
return (
<div class="card">
<slot></slot>
</div>
);
}
}
<link rel="stylesheet" href="/styles/global.css">
Stencil автоматически генерирует кроссбраузерный код с учетом всех современных стандартов. Каждый компонент компилируется в стандартизованный формат, который совместим с большинством популярных браузеров, включая Chrome, Firefox, Safari и Edge.
Компоненты Stencil обеспечивают гибкость и мощность для разработки веб-приложений. Использование этих компонентов в HTML-странице позволяет создавать инкапсулированные, многократно используемые элементы, которые могут быть интегрированы в различные веб-приложения без зависимости от выбранного фреймворка.