<div x-data @notify="alert('Привет, мир!')"> <button @click="$dispatch('notify')">Уведомить</button></div>$dispatch
$dispatch — полезное сокращение для диспетчеризации событий браузера.
При желании вместе с отправляемым событием можно передать и данные. Эти данные будут доступны как свойство .detail события:
<div x-data @notify="alert($event.detail.message)"> <button @click="$dispatch('notify', { message: 'Привет, мир!' })"> Уведомить </button></div>Под капотом $dispatch представляет собой обёртку для более подробного API: element.dispatchEvent(new CustomEvent(...)).
Вы также можете воспользоваться предыдущим методом, чтобы заставить ваши компоненты взаимодействовать друг с другом:
Пример:
<div x-data="{ title: 'Привет' }" @set-title.window="title = $event.detail"> <h1 x-text="title"></h1></div>
<div x-data> <button @click="$dispatch('set-title', 'Привет, мир!')">Нажми меня</button></div><!-- При нажатии содержимое h1 получит текст «Привет, мир!». -->Вы также можете использовать $dispatch() для запуска обновления данных для привязок x-model. Например:
<div x-data="{ title: 'Привет' }"> <span x-model="title"> <button @click="$dispatch('input', 'Привет, мир!')">Нажми меня</button> <!-- После нажатия кнопки `x-model` перехватит всплывающее событие ввода и обновит заголовок. --> </span></div>Это открывает возможности для создания пользовательских компонентов ввода, значение которых можно установить с помощью x-model.
Вы можете использовать значение, возвращаемое методом $dispatch, чтобы проверить, было ли событие отменено. Это полезно, когда нужно предотвратить стандартное поведение какого-либо действия.
<div x-data="{ open: false, canceled: false }" x-on:open.prevent> <button @click="canceled = !$dispatch('open'); if (!canceled) open = true"> Нажми на меня </button> <!-- При нажатии кнопки отправляется событие, и содержимое будет показано только в том случае, если результат истинен (т. е. выполнение не было прервано ни одним обработчиком). -->
<p x-show="canceled">Открытие было отменено обработчиком события.</p>
<div x-show="open"> <h1>Привет</h1> </div></div>Открытие было отменено обработчиком события.
Привет
Это может пригодиться, если вы хотите предотвратить открытие или закрытие модального окна (или чего-то подобного) с помощью обработчиков событий.
Вы можете использовать третий параметр $dispatch, чтобы переопределить стандартные настройки события. Например, можно установить значение bubbles в false:
<!-- 🚫 Не сработает, так как событие прослушивается на родительском элементе --><div x-data="{ title: 'Привет' }" x-on:update-title="title = $event.detail"> <p x-text="title"></p>
<button @click="$dispatch('update-title', 'Привет, мир!', {bubbles: false})"> Нажми на меня </button></div><!-- ✅ Сработает, так как событие прослушивается на том же самом элементе --><div x-data="{ title: 'Привет' }"> <p x-text="title"></p>
<button x-on:update-title="title = $event.detail" @click="$dispatch('update-title', 'Привет, мир!', {bubbles: false})" > Нажми на меня </button></div>Это полезно, когда нужно предотвратить «всплытие» (bubbling) события к родительским элементам.
Правильный вариант использования событий в этом коде…