Рубрики
Без рубрики

Тип на основе глобальных событий в Vue.js

Сегодня я собираюсь показать практический и эффективный способ использования глобальных событий в Vue Framework. Теги с JavaScript, Vue.

В одном из новейших внештатных проектов моего клиента предпочитает Vue Framework который недавно недавно популярен на стороне интерфейса.

Итак, я погрузился в Vue Отказ Я могу сказать, что он очень практичен и эффективен на самом первом взглядах.

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

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

Несомненно, мне не было большим удивлением, потому что Это в основном, на каком динамичном языках заставляют нас преодолеть суровое компромисс вместе со своими супер прохладными преимуществами.

Сегодня я собираюсь показать практический и эффективный способ использования глобальных событий в Vue framework.

Простая шина событий в Vue

Типичный способ внедрения глобального автобуса событий в Vue просто использует Vue Сам объект:

// create a Vue instance somewhere you can access globally
let eventBus = new Vue()

// register an event handler
eventBus.$on("onAppStarted", () => console.log("App Started!"))

// publish an event
eventBus.$emit("onAppStarted")

// Super easy, right?

Проблема, исходящая из строк

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

Поэтому мы можем себе представить, как трудно определить простой опечаток, например OnapStarted вместо onappstarted Как имя события в большом проекте:

eventBus.$on("onApStarted", () => {
  // some business logic here  
})

Неявные параметры события

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

Для того, чтобы идентифицировать, мы возмущаемся, выполняем этот вид тестов каждый раз, когда мы путаем:

eventBus.$on("onAppStarted", (...args) => {
  args.forEach(e => console.log(e))    
})

Правильное решение исходит из ES6 +

Как будучи поклонником, набранным статическим типом Java, какой я не делаю, я предпочитаю использовать типы ясно, если он не имеет супер нетрадиционного для конкретного языка.

Таким образом, я покажу решение избавиться от этих имен событий на основе строк, используя возможности Ecmascript 6 и более поздние предложения.

Определение типов событий

Давайте создадим отдельный файл под названием app-events.js определить нашу Типы событий:

/**
* Event type to publish when app loads
* ProducedBy: components/preload.js
* ConsumedBy: App.vue, views/MainPanel.vue
**/
export class AppStartEvent {

  constructor(){
    // An event type with no arguments
  }

}

/**
* Event type to publish when code changes
* ProducedBy: views/CodePanel.vue
* ConsumedBy: views/MainPanel.vue
* @param {object} editor editor instance
* @param {string} code changed code value inside the editor
**/
export class CodeChangeEvent {

  constructor(editor, code){
    this.editor = editor
    this.code = code
  }

}

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

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

Импортирование типов событий

Когда мы хотим использовать наши события, мы должны импортировать их в наши компоненты:

import {AppStartEvent, CodeChangeEvent} from "@/app-events"

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

Регистрация события

Чтобы зарегистрировать наше мероприятие, просто мы используем наши типы событий и их статические Имя характеристики:

import {AppStartEvent} from "@/app-events"

eventBus.$on(AppStartEvent.name, () => console.log("App Started!"))

Кроме того, мы можем ожидать, что экземпляр типа событий в виде одного аргумента вместо более чем одного аргумента:

import {AppStartEvent, CodeChangeEvent} from "@/app-events"

// we can access the event type instance as a single argument
eventBus.$on(AppStartEvent.name, event => console.log(event))

// also can access to event parameters
eventBus.$on(CodeChangeEvent.name, event => {
  console.log(event.editor)  
  console.log(event.code)  
})

Публикация события

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

// no parameters
eventBus.$emit(AppStartEvent.name, new AppStartEvent())

// with parameters
eventBus.$emit(CodeChangeEvent.name, new CodeChangeEvent(editor, "some code here..."))

Реализация класса обертки

Конечно, мы можем приступить к определению класса как Eventbus и оберните основных методов Vue пример.

class EventBus {

  $eventbus = new Vue()

  listen (eventClass, handler) {
    this.$eventBus.$on(eventClass.name, handler)
  }

  publish (event) {
    this.$eventBus.$emit(event.constructor.name, event)
  }

}

Поэтому мы можем использовать его более практичным способом:

// register an event handler
EventBus.listen(AppStartEvent, () => console.log("App Started!"))

// publish an event
EventBus.publish(new AppStartEvent())

Используя в качестве плагина

Мы можем предпочесть использовать наши Eventbus как Vue плагин :

export default {

  $eventBus: null,

  install (Vue, options) {
    this.$eventBus = new Vue()
  },

  listen (eventClass, handler) {
    this.$eventBus.$on(eventClass.name, handler)
  },

  listenOnce (eventClass, handler) {
    this.$eventBus.$once(eventClass.name, handler)
  },

  remove (eventClass, handler) {
    if (handler) {
      this.$eventBus.$off(eventClass.name, handler)
    } else {
      this.$eventBus.$off(eventClass.name)
    }
  },

  removeAll () {
    this.$eventBus.$off()
  },

  publish (event) {
    this.$eventBus.$emit(event.constructor.name, event)
  }

}

Для того, чтобы использовать плагин, мы должны импортировать и зарегистрироваться на наше Vue пример:

import EventBus from '@/plugin/vue-event-bus';

Vue.use(EventBus)

Следовательно, мы можем просто импортировать и использовать в любом другом компонент Vue:

import EventBus from '@/plugin/vue-event-bus';
import {AppStartEvent} from "@/app-events"

// register an event handler
EventBus.listen(AppStartEvent, () => console.log("App Started!"))

// publish an event
EventBus.publish(new AppStartEvent())

Ну наконец то

В этом коротком руководстве Я объяснил, как реализовать глобальные события на основе типа и использовать их в Vue Отказ

Вы можете найти плагин на Github Отказ

Итак, что вы думаете об этом подходе или что-нибудь, чтобы продлить? Я хотел бы увидеть ваши комментарии ниже!

Оригинал: “https://dev.to/yavuztas/type-based-global-events-in-vue-js-3l29”