Stimulus — это фреймворк, ориентированный на расширение возможностей HTML через декларативное связывание данных и поведения. Одной из ключевых возможностей является работа с событиями, включая создание и обработку пользовательских событий.
Пользовательские события (custom events) позволяют компонентам
взаимодействовать друг с другом без жёсткой зависимости. В стандартном
JavaScript пользовательское событие создаётся с помощью конструктора
CustomEvent:
const event = new CustomEvent("custom:action", {
detail: { message: "Пример пользовательского события" },
bubbles: true
});
element.dispatchEvent(event);
type — имя события, которое может
содержать двоеточие для пространственного разделения
(custom:action).detail — объект с данными,
передаваемыми слушателю события.bubbles — логический флаг,
указывающий, должно ли событие всплывать через DOM.В Stimulus взаимодействие с пользовательскими событиями становится более декларативным.
В контроллерах Stimulus действия объявляются через атрибут
data-action. Для пользовательских событий используется
следующий синтаксис:
<div data-controller="example" data-action="custom:action->example#handleCustomEvent"></div>
custom:action — имя события.example#handleCustomEvent — метод
контроллера, который будет вызван при срабатывании события.Метод контроллера принимает объект события в качестве аргумента, что позволяет работать с переданными данными:
import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
handleCustomEvent(event) {
console.log(event.detail.message); // "Пример пользовательского события"
}
}
Контроллер Stimulus может сам создавать и отправлять пользовательские
события. Для этого используется dispatch метод, встроенный
в базовый класс Controller:
this.dispatch("action", { detail: { message: "Событие отправлено" }, bubbles: true });
detail и другими свойствами
события.Событие автоматически получает префикс контроллера, например,
example:action, если контроллер называется
example.
Stimulus полностью поддерживает стандартное поведение событий:
bubbles) позволяет ловить
события на родительских элементах.<div data-controller="parent" data-action="example:action->parent#onChildAction">
<div data-controller="example"></div>
</div>
В этом примере событие example:action всплывёт до
родителя и будет обработано методом onChildAction.
detail позволяет передавать любые данные от источника
события к слушателю. Например:
this.dispatch("update", { detail: { id: 42, status: "ready" } });
В обработчике:
updateHandler(event) {
const { id, status } = event.detail;
console.log(`Обновление элемента ${id} со статусом ${status}`);
}
Такой подход обеспечивает слабую связанность компонентов и улучшает масштабируемость приложения.
Иногда события должны обрабатываться вне структуры контроллера. Для
этого можно использовать window.addEventListener или
document.addEventListener:
window.addEventListener("example:global", event => {
console.log(event.detail.message);
});
При этом контроллер может инициировать глобальное событие:
this.dispatch("global", { detail: { message: "Глобальное событие" }, target: window });
Использование target позволяет направлять событие на
любой элемент, включая window и document.
controller:event) помогает
избегать конфликтов между событиями разных контроллеров.update,
submit, toggle) повышает читаемость кода.action, change), при этом контроллер
задаёт контекст.Stimulus позволяет указывать несколько событий для одного метода:
<div data-controller="example" data-action="custom:start->example#start custom:stop->example#stop"></div>
Методы start и stop будут вызваны при
соответствующих событиях, что упрощает обработку сложного поведения
компонентов.
События могут инициировать асинхронные процессы:
async handleCustomEvent(event) {
const response = await fetch(`/api/data/${event.detail.id}`);
const data = await response.json();
this.element.textContent = data.name;
}
Stimulus корректно поддерживает асинхронные обработчики, что позволяет интегрировать события с современными API без дополнительного обёртывания.
Пользовательские события в Stimulus предоставляют мощный инструмент для организации взаимодействия между компонентами, сохраняя при этом чистоту HTML и слабую связанность кода. Правильное использование событий облегчает масштабирование и поддержку больших фронтенд-приложений.