Styled JSX в Stencil — это решение для стилизации компонентов с использованием CSS-in-JS подхода. Этот подход позволяет интегрировать стили прямо в компоненты, а не хранить их в отдельных файлах. Styled JSX помогает изолировать стили каждого компонента, предотвращая конфликты и обеспечивая модульность, что особенно важно для крупных приложений.
Stencil использует Styled JSX как один из вариантов стилизации. В отличие от традиционного подхода с внешними CSS-файлами, компоненты, написанные в Stencil, могут содержать стили непосредственно внутри самого компонента с помощью синтаксиса, похожего на обычный CSS, но с дополнительной изоляцией.
Стилизованные элементы в Stencil определяются внутри компонента с
помощью тега <style>, который автоматически
генерирует уникальные идентификаторы для классов и селекторов,
обеспечивая таким образом локальность стилей. Это позволяет избежать
конфликтов между стилями различных компонентов.
Пример базового компонента с использованием Styled JSX:
@Component({
tag: 'my-component',
styleUrl: 'my-component.css',
shadow: true
})
export class MyComponent {
render() {
return (
<div>
<h1>Hello, Stencil!</h1>
<p>This is a styled component.</p>
</div>
);
}
}
В этом примере компонента MyComponent используется
внешний CSS-файл, однако можно встроить стили прямо в компонент, если
использовать Styled JSX.
Синтаксис стилизации в Stencil схож с обычным CSS, но с добавлением определённых возможностей:
Пример использования:
@Component({
tag: 'my-component',
styleUrl: 'my-component.css',
shadow: true
})
export class MyComponent {
@State() active: boolean = false;
toggleActive() {
this.active = !this.active;
}
render() {
return (
<div>
<button onCl ick={() => this.toggleActive()}>Toggle Active</button>
<p class={this.active ? 'active' : 'inactive'}>
This text changes style based on state.
</p>
</div>
);
}
}
В этом примере класс параграфа меняется в зависимости от состояния компонента. Для этого можно использовать стандартный механизм динамических классов в JSX.
В отличие от обычных компонентов, где стили прописываются в отдельных
файлах, в Stencil можно инкапсулировать их прямо в компоненте. Это
достигается с помощью тега <style>, который
используется для написания CSS непосредственно в компоненте.
Пример:
@Component({
tag: 'my-component',
shadow: true
})
export class MyComponent {
render() {
return (
<div>
<style>
{`
p {
font-size: 20px;
color: blue;
}
p.active {
color: green;
}
`}
</style>
<p class="active">Styled paragraph</p>
</div>
);
}
}
В этом примере стили для параграфа определяются непосредственно в компоненте, и они будут применяться только внутри его теневого DOM. Это позволяет избежать глобальных стилей и конфликтов.
Stencil поддерживает Shadow DOM, что означает, что стили, определённые внутри компонента с помощью Styled JSX, будут ограничены только этим компонентом. Это позволяет создавать полностью изолированные компоненты с собственными стилями, не влияющими на другие части приложения.
Когда используется атрибут shadow: true в декораторе
компонента, стили, определённые внутри компонента, не выйдут за пределы
его теневого DOM. Это исключает возможность нежелательного пересечения
стилей между компонентами, что часто бывает проблемой при использовании
глобальных стилей.
@Component({
tag: 'my-component',
shadow: true
})
export class MyComponent {
render() {
return (
<div>
<style>
{`
div {
background-color: lightblue;
padding: 20px;
}
`}
</style>
<div>
<p>This is a shadow DOM component with local styles.</p>
</div>
</div>
);
}
}
В этом примере, несмотря на то, что стиль применяется к
div, он будет действовать только внутри компонента,
благодаря использованию Shadow DOM.
Stencil обеспечивает хорошую производительность, даже когда используется много компонентов с локальными стилями. Так как стили генерируются в момент рендеринга компонента, их изоляция минимизирует влияние на производительность. Использование тени (Shadow DOM) также способствует улучшению производительности, так как каждый компонент работает в своём собственном контексте.
Stencil предоставляет мощный инструмент для создания современных веб-компонентов с локальной стилизацией, обеспечивая высокий уровень изоляции и модульности. Использование Styled JSX позволяет значительно упростить работу с компонентами, сделать код более чистым и понятным, а также предотвратить стилистические конфликты между компонентами.