Stimulus — это легковесный JavaScript-фреймворк, который ориентирован
на организацию поведения HTML-элементов через
контроллеры, ассоциированные с DOM. Основной
строительный блок Stimulus — это класс контроллера,
который расширяет базовый класс Controller из библиотеки
@hotwired/stimulus. Работа с классами в Stimulus сочетает
объектно-ориентированный подход JavaScript и декларативное связывание с
разметкой.
Контроллер определяется как класс, экспортируемый по умолчанию,
который наследует Controller. Базовая структура выглядит
следующим образом:
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
connect() {
console.log("Контроллер подключен");
}
disconnect() {
console.log("Контроллер отключен");
}
}
connect() — вызывается при подключении
контроллера к элементу DOM.disconnect() — вызывается при удалении
элемента из DOM.initialize() — выполняется перед
connect(), позволяет инициализировать внутренние
свойства.Контроллер связывается с HTML-элементом через атрибут
data-controller. Значение атрибута соответствует имени
файла контроллера, приведённого к kebab-case:
<div data-controller="example">
Пример работы контроллера
</div>
Stimulus автоматически создаёт экземпляр класса для каждого элемента с указанным атрибутом.
Методы класса могут быть использованы как действия
(actions) для обработки событий:
<button data-action="click->example#greet">Привет</button>
export default class extends Controller {
greet() {
console.log("Привет!");
}
}
Принципы работы:
click->example#greet — событие click на
кнопке вызывает метод greet контроллера
example.event как
параметр.Stimulus поддерживает декларативное определение значений, которые автоматически связываются с атрибутами элемента:
export default class extends Controller {
static values = { count: Number }
connect() {
console.log(`Текущее значение: ${this.countValue}`);
}
increment() {
this.countValue++;
}
}
HTML:
<div data-controller="counter" data-counter-count-value="5">
<button data-action="click->counter#increment">Увеличить</button>
</div>
static values позволяет определить тип и имя
значения.countValue для чтения и записи.Targets — способ обозначить дочерние элементы для удобного доступа из контроллера:
export default class extends Controller {
static targets = ["output"]
connect() {
this.outputTarget.textContent = "Контроллер подключен";
}
}
HTML:
<div data-controller="example">
<span data-example-target="output"></span>
</div>
this.outputTarget автоматически ссылается на указанный
элемент.this.outputTargets.Stimulus облегчает манипуляцию классами через встроенные методы:
export default class extends Controller {
static targets = ["box"]
toggle() {
this.boxTarget.classList.toggle("active")
}
}
HTML:
<div data-controller="example">
<div data-example-target="box">Содержимое</div>
<button data-action="click->example#toggle">Переключить</button>
</div>
classList.toggle() позволяет динамически менять
состояние элементов.querySelector.Контроллеры Stimulus могут быть расширены через обычное наследование JavaScript:
import BaseController from "./base_controller"
export default class extends BaseController {
connect() {
super.connect()
console.log("Дополнительная логика в дочернем контроллере");
}
}
super.static values и
static targets.data-action, исключая прямую работу с
addEventListener.Stimulus делает классы контроллеров центральной единицей организации фронтенд-логики, обеспечивая чистую, декларативную и расширяемую структуру приложений. Использование методов, значений, целей и наследования позволяет поддерживать крупные проекты удобными для сопровождения и масштабирования.