Stimulus — это JavaScript-фреймворк, ориентированный на управление поведением HTML-элементов через контроллеры. Один из ключевых инструментов для динамического изменения внешнего вида и состояния элементов — использование классов CSS, управляемых непосредственно из контроллера. Это позволяет отделять логику поведения от стилей, сохраняя код чистым и предсказуемым.
classListКаждый элемент DOM имеет свойство classList,
предоставляющее методы для управления классами: add,
remove, toggle и contains. В
Stimulus эти методы используются внутри контроллеров для отражения
состояния интерфейса.
Пример контроллера, управляющего активным состоянием кнопки:
import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
static targets = ["button"]
toggleActive() {
this.buttonTarget.classList.toggle("active");
}
}
toggleActive переключает класс "active" на
целевом элементе.data-attributes для динамических классовStimulus тесно интегрируется с HTML через data-*
атрибуты. Для управления состояниями удобно создавать отдельные
атрибуты, указывающие на классы CSS, которые должны применяться.
Пример:
<button data-controller="toggle"
data-toggle-class="highlighted"
data-action="click->toggle#switch">
Нажми меня
</button>
Контроллер:
import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
static values = { class: String }
switch() {
this.element.classList.toggle(this.classValue);
}
}
classValue считывает значение атрибута
data-toggle-class.Иногда необходимо управлять не одним, а несколькими классами
одновременно, например для отображения разных режимов интерфейса
(например, "loading", "error",
"success"). Stimulus позволяет хранить массив классов и
управлять ими программно.
import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
static targets = ["status"]
setLoading() {
this._clearStatusClasses();
this.statusTarget.classList.add("loading");
}
setError() {
this._clearStatusClasses();
this.statusTarget.classList.add("error");
}
setSuccess() {
this._clearStatusClasses();
this.statusTarget.classList.add("success");
}
_clearStatusClasses() {
this.statusTarget.classList.remove("loading", "error", "success");
}
}
_clearStatusClasses обеспечивает, что элемент всегда
имеет только один активный статус.Stimulus поддерживает определение values, что позволяет
задавать динамические данные прямо в HTML. Это расширяет возможности
управления состояниями через CSS.
Пример с цветовой схемой:
<div data-controller="theme"
data-theme-active-class-value="dark-mode">
Контент
</div>
Контроллер:
import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
static values = { activeClass: String }
enableTheme() {
this.element.classList.add(this.activeClassValue);
}
disableTheme() {
this.element.classList.remove(this.activeClassValue);
}
}
Для плавных эффектов часто используют CSS-переходы, а классы включают или отключают нужные стили. Stimulus удобно интегрируется с анимациями через классы:
showElement() {
this.element.classList.add("visible");
this.element.classList.remove("hidden");
}
hideElement() {
this.element.classList.add("hidden");
this.element.classList.remove("visible");
}
В CSS:
.hidden {
opacity: 0;
transition: opacity 0.3s ease;
}
.visible {
opacity: 1;
transition: opacity 0.3s ease;
}
data-values. Это позволяет переиспользовать один и
тот же код для разных элементов.active, loading,
error), а не конкретные стили (red-bg,
big-font).Stimulus делает управление состояниями элементов через классы
максимально прозрачным и структурированным. Использование методов
classList, значений и data-attributes
позволяет создавать мощные и универсальные контроллеры, поддерживающие
чистый и расширяемый код интерфейса.