Stimulus предоставляет лёгкий и структурированный способ управления поведением интерфейса через контроллеры, а одной из ключевых возможностей является использование модификаторов действий. Модификаторы позволяют точно настраивать, при каких условиях вызываются методы контроллера при наступлении событий.
Действие в Stimulus описывается через атрибут
data-action, который связывает событие DOM
с методом контроллера:
<button data-action="click#controller#method">Нажать</button>
Модификаторы добавляются через точку после имени события или метода, создавая цепочку условий:
<button data-action="click.prevent#controller#method">Нажать</button>
В данном примере модификатор prevent автоматически
вызывает event.preventDefault(), предотвращая стандартное
поведение кнопки.
event.stopPropagation(), останавливая распространение
события.Модификаторы prevent и stop особенно
полезны для управления поведением форм и ссылок:
<form data-action="submit.prevent#form#submitForm">
<input type="text">
<button type="submit">Отправить</button>
</form>
prevent отменяет стандартную отправку формы.stop может применяться для предотвращения дальнейшего
всплытия события к родительским элементам.<div data-action="click.stop#parent#handleClick">
<button data-action="click#child#handleClick">Кнопка</button>
</div>
В этом примере клик по кнопке вызовет метод
child#handleClick, но событие не достигнет родительского
элемента.
<button data-action="click.once#controller#upload">Загрузить</button>
<div data-action="click.self#controller#toggle">
<p>Текст внутри</p>
</div>
Клик по <p> не вызовет метод toggle,
только клик по самому <div>.
Модификаторы debounce и throttle управляют
частотой вызова методов:
<input type="text" data-action="input.debounce-300#controller#search">
debounce-300 откладывает вызов метода на 300
миллисекунд после последнего события.throttle-500 ограничивает вызовы метода до одного раза
каждые 500 миллисекунд.<input type="text" data-action="input.throttle-500#controller#update">
Такие модификаторы полезны для автопоиска, валидации и работы с
событиями scroll или resize.
Stimulus позволяет комбинировать несколько модификаторов через точку:
<button data-action="click.prevent.stop.once#controller#save">
Сохранить
</button>
click не будет всплывать (stop),
стандартное поведение отменено (prevent), метод вызовется
один раз (once).Stimulus предоставляет возможность создавать свои модификаторы через
application.actionModifiers. Это позволяет добавлять
специфическую логику перед вызовом метода:
import { Application } from "@hotwired/stimulus";
const application = Application.start();
application.actionModifiers.set("log", (event, element) => {
console.log("Событие сработало на элементе:", element);
});
<button data-action="click.log#controller#method">Клик</button>
Такой подход расширяет возможности стандартного набора, сохраняя декларативный стиль описания действий.
input,
scroll, mousemove), применять
debounce или throttle, чтобы снизить
нагрузку на браузер.Модификаторы действий в Stimulus обеспечивают мощный и лаконичный механизм управления поведением интерфейса без необходимости вручную писать обработчики событий и проверять условия внутри методов контроллера.