Stencil — это фреймворк для создания веб-компонентов, который предоставляет простые, но мощные инструменты для разработки современных и кроссбраузерных пользовательских интерфейсов. В этой главе будет рассмотрен базовый пример создания компонента с использованием Stencil.
Компоненты в Stencil разрабатываются с помощью стандартного синтаксиса JavaScript и HTML, при этом их код компилируется в чистый JavaScript, который затем можно использовать в различных фреймворках или без них. Основой компонента в Stencil является класс, который включает в себя метаданные, шаблон и логику взаимодействия.
Для создания первого компонента в Stencil необходимо выполнить
несколько шагов. Рассмотрим компонент с именем
my-component.
После установки и настройки Stencil можно начать разработку
компонента. В корне проекта необходимо создать файл компонента с
расширением .tsx, например,
my-component.tsx.
Пример базовой структуры компонента:
import { Component, h } from '@stencil/core';
@Component({
tag: 'my-component',
styleUrl: 'my-component.css',
shadow: true
})
export class MyComponent {
render() {
return (
<div>
<h1>Hello, Stencil!</h1>
<p>This is my first Stencil component.</p>
</div>
);
}
}
Импорт необходимых модулей:
Component: Это декоратор, который используется для
определения компонента.h: Функция для создания элементов в стиле JSX, которая
генерирует виртуальный DOM.Декоратор @Component: Декоратор
@Component используется для определения метаданных
компонента. В нем указывается:
tag: Имя HTML-тега компонента. В этом примере это
my-component.styleUrl: Путь к CSS-файлу компонента. Этот стиль будет
применяться к компоненту.shadow: Включает или выключает использование теневого
DOM (Shadow DOM). В данном случае установлено значение
true, что означает использование Shadow DOM для изоляции
стилей и структуры компонента.Метод render: Метод render
возвращает JSX (или в случае Stencil — JSX-подобный синтаксис), который
будет отображаться в компоненте. Здесь возвращается простой HTML-код с
заголовком и параграфом.
Чтобы компонент выглядел более интересно, можно добавить базовый CSS.
Создается файл my-component.css в той же директории, где
находится компонент:
h1 {
color: #3498db;
}
p {
font-size: 18px;
color: #2c3e50;
}
Этот CSS будет применяться только внутри компонента благодаря
использованию Shadow DOM, если опция shadow: true указана в
декораторе.
После того как компонент написан и стилизован, его можно использовать в любом HTML-документе. Для этого достаточно добавить кастомный тег в разметку:
<my-component></my-component>
Важно, чтобы при сборке проекта Stencil создал файлы, включающие скомпилированный компонент. После этого можно подключить его к HTML-странице.
Stencil позволяет работать с аттрибутами компонентов для динамического изменения их состояния. Аттрибуты могут быть привязаны к свойствам компонента и изменять поведение или внешний вид компонента.
В следующем примере добавим аттрибут для отображения персонализированного сообщения:
import { Component, Prop, h } from '@stencil/core';
@Component({
tag: 'my-component',
styleUrl: 'my-component.css',
shadow: true
})
export class MyComponent {
@Prop() name: string;
render() {
return (
<div>
<h1>Hello, {this.name}!</h1>
<p>This is my first Stencil component.</p>
</div>
);
}
}
В этом примере:
name определен как @Prop(). Это
позволяет передавать значение аттрибута при использовании
компонента.{this.name}.Теперь компонент можно использовать с аттрибутом name,
например:
<my-component name="John"></my-component>
Результат: на экране отобразится “Hello, John!”.
Stencil также поддерживает реактивные свойства, которые позволяют
автоматически обновлять компонент при изменении состояния. Для этого
используются декораторы @State и @Watch.
Добавим реактивное свойство для отслеживания счетчика:
import { Component, State, h } from '@stencil/core';
@Component({
tag: 'my-component',
styleUrl: 'my-component.css',
shadow: true
})
export class MyComponent {
@State() count: number = 0;
increment() {
this.count++;
}
render() {
return (
<div>
<h1>Count: {this.count}</h1>
<button onCl ick={() => this.increment()}>Increment</button>
</div>
);
}
}
Здесь:
count определено с использованием декоратора
@State, что делает его реактивным.increment увеличивает значение count
на 1.count
автоматически обновляется в интерфейсе.С помощью Stencil можно также подписываться на пользовательские события. Например, можно добавить обработчик для события клика на кнопке:
<button onCl ick={() => this.increment()}>Increment</button>
Этот обработчик срабатывает при клике на кнопку и изменяет состояние компонента.
Создание простых компонентов с использованием Stencil включает в себя
несколько базовых шагов: определение компонента через декоратор
@Component, использование шаблонов в JSX-подобном
синтаксисе, работа с аттрибутами через декоратор @Prop и
создание реактивных свойств через @State. Благодаря этому
подходу можно создавать мощные, но в то же время простые и
поддерживаемые компоненты для веб-приложений.