Действия (Actions)
- Контроллеры
- Хуки жизненного цикла
- Действия (Actions)
- Объекты (Targets)
- Переменные контроллера (Values)
-
CSS классы
Действия – это то, как вы обрабатываете события DOM в своих контроллерах.
<div data-controller="gallery">
<button data-action="click->gallery#next">…</button>
</div>
// controllers/gallery_controller.js
import { Controller } from '@hotwired/stimulus';
export default class extends Controller {
next(event) {
// …
}
}
Действие – это связь между:
- методом контроллера
- элементом контроллера
- слушателями событий DOM
Дескрипторы
В атрибуте data-action значение click->gallery#next называется дескриптором действия. В этом дескрипторе:
click– это имя прослушиваемого события DOMgallery– идентификатор контроллераnext– имя метода контроллера, которое будет вызвано
Короткое обозначение событий
Stimulus позволяет сокращать дескрипторы действий для некоторых распространенных пар элемент/событие, таких как пара button/click, опустив имя события:
<button data-action="gallery#next">…</button>
Полный набор этих сокращенных пар выглядит следующим образом:
| Элемент | Имя события по умолчанию |
|---|---|
a |
click |
button |
click |
details |
toggle |
form |
submit |
input |
input |
input type=submit |
click |
select |
change |
textarea |
input |
Глобальные события
Иногда контроллеру необходимо прослушивать события, вызываемые на глобальных объектах window или document.
Вы можете добавить @window или @document к имени события в дескрипторе действия, чтобы установить слушателя события на window или document, соответственно, как в следующем примере:
<div data-controller="gallery"
data-action="resize@window->gallery#layout">
</div>
Опции
Вы можете добавить одну или несколько опций к дескриптору действия, если вам нужно указать опции слушателя событий DOM.
<div
data-controller="gallery"
data-action="scroll->gallery#layout:!passive"
>
<img data-action="click->gallery#open:capture">
Stimulus поддерживает следующие опции:
| Опция действия | Опция слушателя события DOM |
|---|---|
:capture |
{ capture: true } |
:once |
{ once: true } |
:passive |
{ passive: true } |
:!passive |
{ passive: false } |
Event Objects
Метод действия – это метод в контроллере, который служит слушателем событий действия.
Первым аргументом метода действия является объект события DOM. Вы можете захотеть получить доступ к событию по ряду причин, включая:
- для считывания кода клавиши из события клавиатуры
- для чтения координат события мыши
- считывание данных из события input
- для чтения параметров из элемента отправителя действия
- чтобы предотвратить поведение браузера по умолчанию для события
- чтобы узнать, какой элемент отправил событие до того, как оно перешло к этому действию
Следующие основные свойства являются общими для всех событий:
| Свойство события | Значение |
|---|---|
event.type |
Имя события (например, ‘click’) |
event.target |
Элемент, который отправил событие (т.е. самый внутренний элемент, на который был сделан щелчок) |
event.currentTarget |
Элемент, на который установлен слушатель событий (либо элемент с атрибутом data-action, либо document, либо window) |
event.params |
The action params passed by the action submitter element |
Следующие методы событий дают вам больше контроля над тем, как обрабатываются события:
| Метод события | Результат |
|---|---|
| event.preventDefault() | Отменяет поведение события по умолчанию (например, переход по ссылке или отправка формы). |
| event.stopPropagation() | Останавливает событие до того, как оно распространится среди других слушателей на родительских элементах. |
Множественные действия
Значение атрибута data-action представляет собой разделенный пробелами список дескрипторов действий.
Иногда элемент имеет несколько действий. Например, следующий элемент ввода вызывает метод highlight() контроллера field, когда он получает фокус, и метод update() контроллера search при каждом изменении значения элемента:
<input type="text" data-action="focus->field#highlight input->search#update">
Когда элемент имеет более одного действия для одного и того же события, Stimulus вызывает действия слева направо в порядке появления их дескрипторов.
Цепочка действий может быть остановлена в любой момент вызовом Event#stopImmediatePropagation() внутри действия. Любые дополнительные действия справа будут проигнорированы:
highlight: function(event) {
event.stopImmediatePropagation();
// ...
}
Соглашение об именовании
Всегда используйте camelCase для указания имен действий, поскольку они отображаются непосредственно на методы вашего контроллера.
Избегайте имен действий, которые просто повторяют имя события, например click, onClick или handleClick:
<button data-action="click->profile#click">Don't</button>
Вместо этого называйте свои методы действий в зависимости от того, что произойдет при их вызове:
<button data-action="click->profile#showDialog">Do</button>
Это поможет вам рассуждать о поведении блока HTML без необходимости заглядывать в исходный текст контроллера.
Параметры действий
Действия могут иметь параметры, которые считываются из атрибутов данных элемента. Они имеют формат data-[identifier]-[param-name]-param. Параметры должны быть указаны в том же элементе, где объявлено действие которому они должны быть переданы.
Все параметры автоматически приводятся к типу Number, String, Object или Boolean, определяемому по их значению:
| Data attribute | Param | Type |
|---|---|---|
data-item-id-param="12345" |
123 |
Number |
data-item-url-param="/votes" |
"/votes" |
String |
data-item-payload-param='{"value":"1234567"}' |
{ value: 1234567 } |
Object |
data-item-active-param="true" |
true |
Boolean |
Рассмотрим такую схему:
<div data-controller="item spinner">
<button
data-action="item#upvote spinner#start"
data-item-id-param="12345"
data-item-url-param="/votes"
data-item-payload-param='{"value":"1234567"}'
data-item-active-param="true"
>…</button>
</div>
Stimulus вызовет и SpinnerController#start, и ItemController#upvote, но только последнему будут переданы какие-либо параметры:
// ItemController
upvote(event) {
// { id: 12345, url: "/votes", active: true, payload: { value: 1234567 } }
console.log(event.params);
}
// SpinnerController
start(event) {
// {}
console.log(event.params);
}
Если нам больше ничего не нужно от события, мы можем деструктурировать параметры:
upvote({ params }) {
// { id: 12345, url: "/votes", active: true, payload: { value: 1234567 } }
console.log(params);
}
Или деструктурировать только те параметры, которые нам нужны, в случае, если несколько действий на одном контроллере используют один и тот же элемент:
upvote({ params: { id, url } }) {
console.log(id); // 12345
console.log(url); // "/votes"
}
- Контроллеры
- Хуки жизненного цикла
- Действия (Actions)
- Объекты (Targets)
- Переменные контроллера (Values)
-
CSS классы