Riot.js реализует компонентный подход к разработке интерфейсов, предоставляя мощный механизм для инкапсуляции логики, разметки и стилей в пределах одного компонента. Одной из ключевых особенностей является возможность работы с Scoped CSS, что позволяет создавать стили, применимые только к конкретному компоненту, без риска конфликтов с глобальными стилями.
В Riot.js стили компонента помещаются внутрь тега
<style> в файле компонента. Эти стили автоматически
инкапсулируются и применяются только к текущему
компоненту. Например:
<my-button>
<button>{ opts.label }</button>
<style>
button {
background-color: #4CAF50;
color: white;
border: none;
padding: 10px 20px;
cursor: pointer;
}
button:hover {
background-color: #45a049;
}
</style>
</my-button>
В этом примере стиль кнопки действует исключительно на
<button> внутри компонента
<my-button>. Даже если на странице существуют другие
кнопки с аналогичными классами или тегами, на них эти стили не
распространяются.
Riot.js использует динамическое добавление уникальных атрибутов к DOM-элементам компонента и к соответствующим селекторам CSS. При компиляции:
Например, вышеуказанный <button> может быть
преобразован в DOM с атрибутом вроде data-rid="r1", а
селектор CSS будет выглядеть как button[data-rid="r1"].
При использовании вложенных компонентов важно учитывать, что:
<style> внутри его собственного файла.class и className.Пример передачи класса:
<parent-component>
<child-component class="highlighted"></child-component>
<style>
.highlighted {
border: 2px solid red;
}
</style>
</parent-component>
В данном случае класс highlighted передается дочернему
компоненту, что позволяет контролировать его стили из родителя, не
нарушая принципов инкапсуляции.
Riot.js поддерживает использование псевдоклассов и CSS-анимаций внутри компонентов. Scoped CSS корректно обрабатывает:
:hover, :focus, :active для
интерактивных элементов.@keyframes.Пример анимации внутри компонента:
<fade-box>
<div class="box">{ opts.text }</div>
<style>
.box {
opacity: 0;
animation: fadeIn 1s forwards;
}
@keyframes fadeIn {
to {
opacity: 1;
}
}
</style>
</fade-box>
Riot.js автоматически модифицирует селекторы @keyframes,
чтобы предотвратить конфликты имен анимаций между компонентами.
Иногда возникает необходимость задать стили, не ограниченные
компонентом. Для этого используется глобальный селектор
:global:
<my-component>
<p class="text">Пример текста</p>
<style>
:global(.text) {
font-size: 18px;
color: blue;
}
</style>
</my-component>
В этом случае селектор .text будет применяться
глобально на всей странице, но рекомендуется
использовать :global только при необходимости, чтобы не
нарушать принцип изоляции.
Riot.js позволяет динамически изменять классы через привязку:
<toggle-button>
<button class={ isActive ? 'active' : '' } oncl ick={ toggle }>{ isActive ? 'ON' : 'OFF' }</button>
<style>
button.active {
background-color: green;
color: white;
}
button {
background-color: grey;
color: black;
}
</style>
<script>
export default {
isActive: false,
toggle() {
this.isActive = !this.isActive;
}
}
</script>
</toggle-button>
Scoped CSS корректно обрабатывает динамически добавленные классы, сохраняя изоляцию стилей.
Scoped CSS в Riot.js предоставляет разработчику гибкий и безопасный способ управления стилями на уровне компонентов, позволяя создавать крупные и масштабируемые интерфейсы без риска глобальных конфликтов и путаницы в стилях.