Stimulus — это фреймворк JavaScript, созданный для добавления интерактивности на страницы без полного перехода на SPA-подход. Его ключевая философия заключается в «привязке» поведения к HTML-элементам через контроллеры, действия и значения. Каждый контроллер отвечает за ограниченный набор функциональности, что упрощает поддержку и тестирование кода.
Контроллеры создаются как классы, наследуемые от
Stimulus.Controller. Они подключаются к элементам с помощью
атрибута data-controller, а взаимодействия с DOM происходят
через действия (data-action) и
целевые элементы (data-target).
<div data-controller="feedback">
<input data-feedback-target="name" type="text">
<button data-action="click->feedback#submit">Отправить</button>
</div>
import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
static targets = ["name"];
submit() {
console.log(`Имя пользователя: ${this.nameTarget.value}`);
}
}
Stimulus позволяет хранить значения внутри контроллера с помощью Value API. Это удобно для динамических форм, где необходимо отслеживать состояние полей или переключателей.
export default class extends Controller {
static values = { feedbackText: String }
update(event) {
this.feedbackTextValue = event.target.value;
console.log(this.feedbackTextValue);
}
}
<textarea data-controller="feedback"
data-feedback-feedback-text-value=""
data-action="input->feedback#update"></textarea>
Value API обеспечивает автоматическую синхронизацию данных между DOM и контроллером, упрощая логику валидации и отправки форм.
Stimulus связывает события DOM с методами контроллера через атрибут
data-action. Формат записи:
<событие>-><имя_контроллера>#<метод>
Можно комбинировать несколько событий и контроллеров на одном элементе:
<button
data-action="click->feedback#submit mouseover->feedback#highlight">
Отправить
</button>
Методы контроллера получают объект события в качестве аргумента, что
позволяет управлять поведением элементов на лету. Важно учитывать
контекст this, который всегда указывает на
экземпляр контроллера, обеспечивая доступ к целям и значениям.
Targets упрощают взаимодействие с отдельными
элементами внутри контроллера, избегая поиска через
querySelector. Они определяются через
data-<controller>-target и перечисляются в
контроллере:
static targets = ["name", "email"];
После этого к элементам можно обращаться как
this.nameTarget или this.emailTargets (если
несколько элементов с одинаковым target). Это повышает читаемость кода и
снижает вероятность ошибок при манипуляции DOM.
Сбор обратной связи часто требует отправки данных на сервер. Stimulus
легко интегрируется с fetch:
submit() {
const payload = {
name: this.nameTarget.value,
feedback: this.feedbackTextValue
};
fetch("/feedback", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload)
}).then(response => {
if (response.ok) {
this.clearForm();
}
});
}
clearForm() {
this.nameTarget.value = "";
this.feedbackTextValue = "";
}
Асинхронная обработка обеспечивает немедленный отклик интерфейса и позволяет показывать пользователю уведомления об успешной отправке или ошибках.
Stimulus позволяет создавать динамические формы, добавлять и удалять поля, отслеживать состояние чекбоксов и переключателей. Пример добавления новых полей:
addField() {
const container = this.element.querySelector(".fields");
const input = document.createElement("input");
input.type = "text";
container.appendChild(input);
}
Использование Targets для контейнера и Value API для хранения состояния делает интерфейс гибким и минимизирует необходимость сложной логики в родительских компонентах.
Stimulus облегчает клиентскую валидацию через методы контроллера и связь с DOM:
validate() {
if (!this.nameTarget.value) {
this.showError("Имя обязательно");
}
}
showError(message) {
this.errorTarget.textContent = message;
}
Такой подход позволяет централизованно управлять ошибками, а также комбинировать валидацию с асинхронной отправкой формы.
Stimulus не конфликтует с другими библиотеками и может работать вместе с Rails, Turbo, Axios и другими инструментами. Он идеально подходит для постепенного добавления интерактивности в существующие страницы без полной перестройки приложения.
Stimulus строит архитектуру вокруг минимализма и прямого соответствия HTML и JavaScript, что делает его эффективным инструментом для сбора обратной связи. Использование контроллеров, действий, Targets и Value API позволяет создавать динамические, интерактивные и легко поддерживаемые формы, обеспечивая надежное взаимодействие пользователя с веб-приложением.