Skip to content

11. Проект [vuejs-09]: використання плагіна [eventBus]

Проєкт [vuejs-09] ідентичний проєкту [vuejs-08], за винятком того, що в ньому введено поняття плагіна. Структура проєкту така:

Image

11.1. Плагін [./plugins/event-bus]

Скрипт [./event-bus.js] залишається таким самим, як у попередньому прикладі:


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

Плагін [./plugins/event-bus.js] має такий вигляд:


export default {
  install(Vue, eventBus) {
    // додає властивість [$eventBus] до класу Vue
    Object.defineProperty(Vue.prototype, '$eventBus', {
      // при зверненні до Vue.$eventBus повертається другий параметр [eventBus]
      get: () => eventBus,
    })
  }
}

Коментарі

  • плагін [Vue] — це об’єкт, що має функцію [install] (рядок 2). Ця функція автоматично викликається, коли в коді заявляється використання плагіна;
  • рядки 1–9: об’єкт, що експортується скриптом;
  • рядок 2: функція [install] приймає тут два параметри:
    • [Vue]: функція, отримана за допомогою інструкції [import Vue from ‘Vue’]. Може розглядатися як клас;
    • [eventBus]: об’єкт, експортований скриптом [./event-bus];
  • рядки 4–7: змінюють визначення (так званий прототип) функції [Vue], додаючи до неї властивість [$eventBus]. Якщо розглядати термін [classe], то властивість [$eventBus] додається до класу [Vue]. Отже, компоненти, які є екземплярами [Vue], матимуть доступ до цієї нової властивості;
  • у рядку 6 вказано, що при зверненні до властивості [Vue].$eventBus буде отримано параметр [eventBus] із рядка 2. Трохи далі ми побачимо, що цим другим параметром буде об’єкт [eventBus], експортований скриптом [./event-bus.js]. Отже, у підсумку, коли компонент C використовуватиме вираз [C.$eventBus], він буде посилатися на об’єкт [eventBus], експортований скриптом [./event-bus.js]. Це дозволить йому уникнути імпорту скрипта [./event-bus.js]. У цьому і полягає перевага плагіна: спростити доступ до об’єкта [eventBus], експортованого скриптом [./event-bus.js];
  • зазначимо, що сам плагін не обов’язково має називатися [event-bus.js]. Його можна було б назвати, наприклад, [plugin-event-bus];
  • також слід зауважити, що символ $ у [$eventBus] є умовною позначкою для властивостей [Vue], які були додані за допомогою плагінів. Дотримуватися цієї умовної позначки не обов’язково. У цьому тексті ми будемо її дотримуватися;

11.2. Головний скрипт [main.js]

Скрипт [./plugins/event-bus.js] визначає плагін для фреймворку [Vue.js]. Цей плагін поки що не використовується, а лише визначений. Його активує скрипт [main.js]:


// імпортується
import Vue from 'vue'
import App from './App.vue'

// плагіни
import BootstrapVue from 'bootstrap-vue'
Vue.use(BootstrapVue);

// bootstrap
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'

// eventbus
import eventBus from './event-bus';
import PluginEventBus from './plugins/event-bus';
Vue.use(PluginEventBus, eventBus);

// конфігурація
Vue.config.productionTip = false

// інстанціювання проєкту [App]
new Vue({
  render: h => h(App),
}).$mount('#додаток')

Коментарі

  • рядки 14–16 активують плагін [PluginEventBus]. Після рядка 16 усі екземпляри класу (функції) [Vue] мають властивість [$eventBus], яка для кожного з них вказує на один і той самий об’єкт, експортований скриптом [./event-bus.js]. Це стосуватиметься кожного з компонентів проєкту;

11.3. Головний вигляд [App]

Головний вигляд [App] залишається таким самим, як і в попередньому проєкті.

11.4. Компонент [Component1]

Компонент [Component1] тепер використовує свою властивість [$eventBus] для обробки події [someEvent]:


<template>
  <b-row>
    <b-col>
      <b-alert show
               variant="warning"
               v-if="showMsg">Evénement [someEvent] intercepté par [Component1]. Valeur reçue={{data}}</b-alert>
    </b-col>
  </b-row>
</template>

<script>
  export default {
    name: "component1",
    // стан компонента
    data() {
      return {
        data: "",
        showMsg: false
      };
    },
    // методи управління подіями
    methods: {
      // управління подією [someEvent]
      doSomething(data) {
        this.data = data;
        this.showMsg = true;
      }
    },
    // управління життєвим циклом компонента
    // подія [created] — компонент створено
    created() {
      // обслуговування події [someEvent]
      this.$eventBus.$on("someEvent", this.doSomething);
    }
  };
</script>

Коментарі

  • у рядку 33 використовується властивість [this.$eventBus] компонента. Крім того, слід зауважити, що скрипт у рядку 11 більше не імпортує скрипт [./event-bus.js];

11.5. Компонент [Component2]

Компонент [Component2] тепер використовує свою властивість [$eventBus] для генерації події [someEvent]:


<template>
  <div>
    <b-button @click="createEvent">Créer un événement</b-button>
  </div>
</template>
<!-- скрипт -->
<script>
  export default {
    name: "component2",
    // методи обробки подій
    methods: {
      createEvent() {
        this.$eventBus.$emit("someEvent", { x: 2, y: 4 })
      }
    }
  };
</script>

Коментарі

  • рядок 13, використання властивості [this.$eventBus] компонента. Крім того, слід зауважити, що скрипт у рядку 7 більше не імпортує скрипт [./event-bus.js];

11.6. Компонент [Component3]

Компонент [Component3] має той самий код, що й [Component1]. Він також обробляє подію [someEvent].

11.7. Виконання проєкту

Image

Отримуємо ті самі результати, що й у попередньому проєкті.