Поиск по сайту:

Как создать глобальную шину событий в Vue 2


Введение

Шаблон шины событий/публикация-подписка — это способ заставить несвязанные разделы вашего приложения взаимодействовать друг с другом.

Система событий, используемая в компонентах Vue, может использоваться в схеме шины событий/публикации-подписки.

Примечание. Это руководство предназначено для Vue 2. Рекомендуется для Vue 3.

В этой статье вы примените мощную встроенную шину событий Vue.

Предпосылки

Для выполнения этого урока вам понадобятся:

  • Node.js установлен локально, что можно сделать, следуя инструкциям по установке Node.js и созданию локальной среды разработки.
  • Некоторое знакомство с использованием компонентов Vue.js может оказаться полезным.

Это руководство было проверено с помощью Node v15.3.0, npm v6.14.9 и vue v2.6.11.

Шаг 1 — Настройка проекта

Для целей этого руководства вы создадите проект Vue по умолчанию, сгенерированный с помощью @vue/cli.

  1. npx @vue/cli create vue-event-bus-example --default

Это настроит новый проект Vue с настройками по умолчанию: Vue 2, babel, eslint.

Перейдите в только что созданный каталог проекта:

  1. cd vue-event-bus-example

Вам нужно будет создать шину событий и экспортировать ее куда-нибудь, чтобы ее могли использовать другие модули и компоненты. Сначала создайте новый файл. Импортируйте библиотеку Vue. Затем экспортируйте его экземпляр.

import Vue from 'vue';
export const EventBus = new Vue();

Для этого руководства в качестве экземпляра была задана переменная EventBus.

По сути, вы получаете компонент, который полностью отделен от DOM или остальной части вашего приложения. Все, что на нем существует, — это его методы экземпляра.

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

Далее применим EventBus.$emit().

Шаг 2 — Отправка событий

Рассмотрим сценарий с компонентом, который уведомляет все приложение о том, сколько раз он был нажат каждый раз, когда кто-то нажимает на него.

Примечание. В этом примере используется компонент с одним файлом, но вы можете использовать любой метод создания компонентов, который вам нравится.

Вот как вы можете реализовать это с помощью EventBus.$emit(channel: string, payload1: any, ...):

<template>
  <button @click="emitGlobalClickEvent()">{{ clickCount }}</button>
</template>

<script>
import { EventBus } from '@/event-bus';

export default {
  data() {
    return {
      clickCount: 0
    }
  },

  methods: {
    emitGlobalClickEvent() {
      this.clickCount++;
      EventBus.$emit('clicked', this.clickCount);
    }
  }
}
</script>

Этот код создает кнопку. Нажатие на кнопку отправит событие на канал (clicked) с полезной нагрузкой (clickCount).

Измените App.vue, чтобы использовать этот компонент.

<template>
  <div id="app">
    <ClickCountButton></ClickCountButton>
  </div>
</template>

<script>
import ClickCountButton from './components/ClickCountButton'

export default {
  name: 'App',
  components: {
    ClickCountButton
  }
}
</script>

Далее применим EventBus.$on.

Шаг 3 — Получение событий

Теперь любая другая часть вашего приложения может импортировать шину событий и прослушивать канал clicked с помощью EventBus.$on(channel: string, callback(payload1, ...)).

Примените это к своему приложению, изменив App.vue:

<script>
import { EventBus } from './event-bus';
import ClickCountButton from './components/ClickCountButton'

export default {
  name: 'App',
  components: {
    ClickCountButton
  }
}

const clickHandler = function(clickCount) {
  console.log(`The button has been clicked ${clickCount} times!`)
}

EventBus.$on('clicked', clickHandler);
</script>

Этот код создает прослушиватель событий для clicked и записывает в консоль сообщение о том, сколько раз была нажата кнопка.

Примечание. Если вы хотите прослушивать только первую передачу события, вы можете использовать EventBus.$once(channel: string, callback(payload1,...)).

Далее применим EventBus.$off.

Шаг 4 — Удаление прослушивателей событий

Вы можете отменить регистрацию обработчика из канала clicked, используя EventBus.$off(channel: string, callback(payload1,...)).

Примените это к своему приложению, изменив App.vue:

<script>
import { EventBus } from './event-bus';
import ClickCountButton from './components/ClickCountButton'

export default {
  name: 'App',
  components: {
    ClickCountButton
  }
}

const clickHandler = function(clickCount) {
  console.log(`The button has been clicked ${clickCount} times!`)
}

EventBus.$on('clicked', clickHandler);

EventBus.$off('clicked', clickHandler);
</script>

Предоставляя событие и обратный вызов, EventBus.$off удалит прослушиватель только для этого конкретного обратного вызова.

Примечание. Вы также можете удалить всех слушателей для определенного события, используя EventBus.$off(clicked) без аргумента обратного вызова.

И если вам действительно нужно удалить каждого слушателя из EventBus, независимо от канала, вы можете вызвать EventBus.$off() вообще без аргументов.

Теперь вы использовали .$emit, .$on и .$off.

Заключение

В этом руководстве вы использовали мощную встроенную шину событий Vue для прослушивания события clicked и регистрации сообщения с количеством кликов. Это было достигнуто за счет использования .$emit, .$on и .$off.

Если вы хотите узнать больше о Vue.js, посетите нашу тематическую страницу Vue.js, где вы найдете упражнения и проекты по программированию.