Stimulus — это легковесный JavaScript-фреймворк, ориентированный на улучшение интерактивности веб-страниц без необходимости внедрять сложные SPA-архитектуры. Основной строительный блок Stimulus — контроллер, который связывает HTML и JavaScript, позволяя управлять поведением элементов страницы через декларативные атрибуты.
Контроллер Stimulus представляет собой класс, унаследованный от
Controller из пакета @hotwired/stimulus:
import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
connect() {
console.log("Контроллер подключен");
}
}
connect() — метод жизненного цикла,
вызываемый при присоединении контроллера к DOM.disconnect() — вызывается при удалении
элемента из DOM.initialize() — вызывается один раз при
создании контроллера, до connect().Порядок вызовов: initialize() →
connect() → (взаимодействие пользователя) →
disconnect().
Контроллер связывается с элементом HTML через атрибут
data-controller:
<div data-controller="example"></div>
Имя контроллера (example) соответствует имени файла при
экспорте по умолчанию: example_controller.js. Это позволяет
Stimulus автоматически находить и инициализировать контроллер для
указанного элемента.
Stimulus предоставляет механизм значений, позволяющий безопасно хранить и изменять данные контроллера:
import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
static values = { count: Number }
connect() {
console.log(`Текущее значение count: ${this.countValue}`);
}
increment() {
this.countValue++;
}
}
HTML для связи с count:
<div data-controller="counter" data-counter-count-value="5"></div>
static values определяет типы и имена значений.this.countValue).Targets позволяют явно определять элементы внутри контроллера для упрощённого доступа:
import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
static targets = ["output", "button"]
connect() {
this.outputTarget.textContent = "Привет, Stimulus!";
}
handleClick() {
this.outputTarget.textContent = "Кнопка нажата!";
}
}
HTML:
<div data-controller="example">
<span data-example-target="output"></span>
<button data-example-target="button" data-action="click->example#handleClick">Нажать</button>
</div>
static targets — массив имен целевых элементов.this.<targetName>Target.this.<targetName>Targets возвращает массив.Actions связывают события DOM с методами контроллера. Синтаксис:
data-<controller>-action="<событие>-><контроллер>#<метод>"
Пример:
<button data-action="click->example#handleClick">Нажать</button>
Можно объединять несколько действий через пробел:
<button data-action="click->example#handleClick mouseover->example#handleHover">Кнопка</button>
Stimulus автоматически преобразует имена контроллеров и targets:
my_controller.js →
data-controller="my".myTarget →
data-my-target="targetName".countValue →
data-my-count-value="число".Использование строгой схемы имен обеспечивает предсказуемость и консистентность в коде.
Контроллер может управлять несколькими элементами одновременно через targets:
static targets = ["item"]
highlightAll() {
this.itemTargets.forEach(el => el.classList.add("highlight"));
}
HTML:
<div data-controller="list">
<div data-list-target="item">Элемент 1</div>
<div data-list-target="item">Элемент 2</div>
</div>
this.itemTargets автоматически собирает все элементы с
данным target.Можно задать значения по умолчанию и отслеживать их изменения:
static values = { enabled: Boolean }
connect() {
if (this.enabledValue) {
console.log("Контроллер активен");
}
}
enabledValueChanged() {
console.log(`Состояние изменилось: ${this.enabledValue}`);
}
<valueName>ValueChanged.Структура и синтаксис контроллера Stimulus строится вокруг четкой декларативной связи HTML и JavaScript. Основные элементы — контроллер, targets, values и actions — позволяют создавать модульный, легко расширяемый и поддерживаемый код, минимизируя прямое манипулирование DOM.