Перейти к содержимому

События

Alpine позволяет легко прослушивать события браузера и реагировать на них.

Используя x-on, можно прослушивать события браузера, отправляемые на элемент или внутри него.

Вот базовый пример прослушивания нажатия на кнопку:

<div x-data>
<button x-on:click="alert('нажато')">Нажми меня</button>
</div>

В качестве альтернативы можно использовать сокращённый синтаксис: @. Приведём тот же пример, что и раньше, но с использованием сокращённого синтаксиса (который мы будем использовать в дальнейшем):

<button @click="...">...</button>

Помимо click, можно прослушивать любое событие браузера по имени. Например: @mouseenter, @keyup и т. д. являются допустимым синтаксисом.

Допустим, вы хотите перехватить нажатие клавиши Enter внутри элемента <input>. Alpine упрощает эту задачу, добавляя .enter следующим образом:

<div x-data>
<input @keyup.enter="alert('вы нажали Enter')" placeholder="Нажмите клавишу Enter" />
</div>

Вы даже можете комбинировать модификаторы клавиш, чтобы прослушивать комбинации, например, нажатие Enter при удержании Shift:

<div x-data>
<input @keyup.shift.enter="alert('вы нажали Shift + Enter')" placeholder="Нажмите Shift и Enter" />
</div>

При реагировании на события браузера часто необходимо «предотвратить поведение по умолчанию» (предотвратить поведение события браузера по умолчанию).

Например, если вы хотите прослушивать отправку формы, но запретить браузеру отправлять запрос формы, можно использовать .prevent:

<form @submit.prevent="...">...</form>

Вы также можете применить .stop для достижения эквивалента event.stopPropagation().

Иногда вам может потребоваться доступ к собственному объекту событий браузера внутри вашего собственного кода. Чтобы упростить это, Alpine автоматически добавляет волшебную переменную $event:

<button @click="$event.target.remove()">Удалить меня</button>

Помимо прослушивания событий браузера, вы также можете их отправлять. Это чрезвычайно полезно для связи с другими компонентами Alpine или запуска событий в инструментах за пределами Alpine.

Для этого Alpine предоставляет магический хелпер под названием $dispatch:

<div x-data @foo="alert('Событие foo было отправлено')">
<button @click="$dispatch('foo')">Отправить</button>
</div>

Как вы можете видеть, при нажатии кнопки Alpine отправит событие браузера под названием «foo», а наш слушатель @foo в <div> отловит его и отреагирует.

Из-за характера событий в браузере иногда полезно прослушивать события в объекте window верхнего уровня.

Это позволяет вам полностью взаимодействовать между компонентами, как показано в следующем примере:

<div x-data>
<button @click="$dispatch('foo')">Отправить</button>
</div>
<div x-data @foo.window="alert('Событие foo было отправлено')" hidden></div>

В приведённом выше примере, если мы нажмем кнопку в первом компоненте, Alpine отправит событие «foo». Из-за того, как события работают в браузере, они «проходят» через родительские элементы вплоть до window верхнего уровня.

Теперь, поскольку в нашем втором компоненте мы прослушиваем «foo» (с .window), при нажатии кнопки этот слушатель подхватит его и зарегистрирует сообщение «Событие foo было отправлено».

  1. Какой из указанных вариантов синтаксиса неверен?

  2. Как получить доступ к объекту события?

  3. Как прослушивать пользовательские события?