В одном из новейших внештатных проектов моего клиента предпочитает 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”