Stimulus — это фреймворк JavaScript, ориентированный на повышение интерактивности веб-страниц без создания сложной клиентской архитектуры. Его основа строится на принципе «HTML управляет поведением», что делает семантическую разметку ключевым элементом разработки.
В Stimulus взаимодействие с элементами страницы осуществляется через
контроллеры, которые привязываются к DOM с помощью
атрибута data-controller. Например:
<div data-controller="example">
<button data-action="click->example#greet">Сказать привет</button>
</div>
data-controller="example" указывает на контроллер
ExampleController.data-action="click->example#greet" связывает событие
click с методом greet контроллера.Использование таких атрибутов повышает семантическую выразительность HTML: элементы несут не только визуальную функцию, но и смысловую нагрузку, указывая на своё поведение.
Stimulus позволяет определять targets — элементы, на
которые контроллер может ссылаться напрямую. Это делается через атрибут
data-<controller>-target.
<div data-controller="form">
<input data-form-target="name" type="text">
<button data-action="click->form#submit">Отправить</button>
</div>
В контроллере:
import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
static targets = ["name"];
submit() {
console.log(this.nameTarget.value);
}
}
Преимущества targets:
Stimulus активно использует data-action для привязки событий. Формат:
data-action="событие->контроллер#метод"
Можно комбинировать несколько действий:
<button data-action="mouseover->tooltip#show mouseout->tooltip#hide">
Наведи мышь
</button>
Это позволяет отделять логику от представления, сохраняя семантику разметки и облегчая поддержку интерактивных элементов.
С помощью data-<controller>-<name>-value
можно хранить данные в HTML, доступные в контроллере. Пример:
<div data-controller="counter" data-counter-step-value="5">
<button data-action="click->counter#increment">Увеличить</button>
</div>
В контроллере:
export default class extends Controller {
static values = { step: Number }
count = 0
increment() {
this.count += this.stepValue
console.log(this.count)
}
}
Преимущества использования values:
Для крупных интерфейсов Stimulus рекомендует использовать связку нескольких контроллеров. Каждый контроллер отвечает за определённую часть DOM, а взаимодействие реализуется через события или shared targets. Например, модальное окно может состоять из:
modal — управляет открытием и закрытием.modal-content — отвечает за содержимое и динамические
элементы.Такое разделение поддерживает чистую и семантически насыщенную разметку, где каждый элемент несёт конкретную роль.
Stimulus автоматически подключает контроллеры к новым элементам, если они добавляются через DOM API или Turbo. Это позволяет поддерживать динамическую семантическую разметку без переписывания логики.
Пример с Turbo Frames:
<turbo-frame id="comments" data-controller="comments">
<!-- новые комментарии будут автоматически управляться контроллером -->
</turbo-frame>
Эти подходы делают Stimulus мощным инструментом для создания интерактивных, поддерживаемых и семантически насыщенных веб-приложений.