Сбор обратной связи от пользователей

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 позволяет создавать динамические, интерактивные и легко поддерживаемые формы, обеспечивая надежное взаимодействие пользователя с веб-приложением.