Stimulus — это JavaScript-фреймворк, который реализует паттерн контроллеров, связывая HTML и поведение через декларативные атрибуты. Главная цель — минимизация сложного состояния в клиентском коде и упрощение поддержки динамических интерфейсов. Контроллер в Stimulus является центральной единицей, которая управляет поведением элементов DOM, реагируя на события и обновляя состояние интерфейса.
Каждый контроллер представляет собой класс,
наследуемый от Controller, с определённым набором
связанных действий и целевых
элементов. Контроллеры инициализируются автоматически при
загрузке страницы или появлении соответствующих элементов в DOM.
Контроллер создаётся как отдельный JavaScript-файл. Простейший пример структуры контроллера:
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = ["output"]
connect() {
console.log("Контроллер подключён")
}
update(event) {
this.outputTarget.textContent = event.target.value
}
}
Ключевые моменты:
static targets — массив, определяющий именованные
элементы DOM, на которые контроллер будет ссылаться. Это позволяет легко
работать с конкретными узлами, избегая сложных селекторов.connect() вызывается автоматически при
инициализации контроллера.data-action.Stimulus использует атрибут data-action для связывания
событий с методами контроллера. Формат:
<button data-action="click->example#update">Обновить</button>
Здесь click — тип события, example — имя
контроллера, update — метод, который будет вызван. Такой
подход обеспечивает чистую разметку и минимальный
JS-код, избегая прямого навешивания обработчиков через
addEventListener.
Target — это способ выделения определённых элементов DOM для дальнейшего использования в контроллере:
<div data-controller="example">
<input data-example-target="input">
<span data-example-target="output"></span>
</div>
В контроллере можно обращаться к этим элементам через автоматически сгенерированные свойства:
this.inputTarget.value // доступ к input
this.outputTarget.textContent = "новое значение"
Если необходимо работать с множеством элементов одной цели,
используется суффикс Targets:
this.itemsTargets.forEach(item => { ... })
Stimulus позволяет определять связанные с контроллером
данные через static values. Это создаёт удобные
свойства с типизацией и синтаксисом для чтения/записи:
static values = { count: Number }
increment() {
this.countValue++
}
В HTML значения задаются через атрибуты:
<div data-controller="counter" data-counter-count-value="5"></div>
После инициализации контроллера this.countValue будет
равно 5, и любые изменения будут синхронизированы с
DOM.
Контроллеры имеют несколько событий жизненного цикла, которые позволяют выполнять действия на различных этапах работы:
connect() — вызывается при добавлении элемента в
DOM.disconnect() — вызывается при удалении элемента из
DOM.initialize() — вызывается перед connect(),
до любых привязок событий.Эти методы позволяют управлять состоянием, настройкой и очисткой ресурсов, избегая утечек памяти.
Stimulus облегчает поддержку многоуровневых интерфейсов:
Targets и Values для
изоляции состояния.this.element.dispatchEvent(new CustomEvent("example:updated", {
bubbles: true,
detail: { value: this.countValue }
}))
Другие контроллеры могут подписываться на это событие через
data-action="example:updated->other#handleUpdate".
Stimulus отлично сочетается с серверными фреймворками и динамическими интерфейсами:
fetch или Rails UJS вместе с
контроллерами делает фронтенд более реактивным без большого количества
стороннего кода.Stimulus формирует стиль разработки, где поведение привязано к элементам, а не к глобальным селекторам, что повышает читаемость, тестируемость и масштабируемость веб-приложений.