带有 Composition API 的 Vue 3 事件总线

sen*_*nty 3 javascript event-bus vue.js vuejs3 vue-composition-api

我已经设置了手套并尝试将事件分派到另一个组件,但我很难,因为在该setup()方法中它没有this用于访问应用程序实例。

这是我尝试过的:

import App from './App.vue'
const el = document.getElementById('app')

import mitt from 'mitt';
const emitter = mitt();

const app = createApp(App)
app.config.globalProperties.emitter = emitter;
app.mount(el);
Run Code Online (Sandbox Code Playgroud)

在组件中,我想调度一个事件

export default {
   setup() {
      function toggleSidebar() {
          this.emitter.emit('toggle-sidebar');

          console.log(this); // binds to setup(), not the vue instance.
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

由于this不存在,我无法访问.emitter. 我错过了什么?如何在 Vue 3 组合 api 中使用官方建议的手套?


顺便说一句,如果我使用 v2 语法,我可以访问this.emitter. 但我对 Composition API 方式很好奇

export default {
  mounted() {
    console.log(this.emitter); // works
  }
} 
Run Code Online (Sandbox Code Playgroud)

Dan*_*Dan 6

要在 Vue 3 Composition API 中使用事件总线,请providemain.js 中使用 Vue 3 的新API ,然后inject在任何组件中使用:

1. 安装手套

npm install mitt
Run Code Online (Sandbox Code Playgroud)

2.提供:

主文件

import { createApp } from "vue";
import App from "./App.vue";

import mitt from 'mitt';                  // Import mitt
const emitter = mitt();                   // Initialize mitt

const app = createApp(App);
app.provide('emitter', emitter);          // ? Provide as `emitter`
app.mount('#app');
Run Code Online (Sandbox Code Playgroud)

3. 注入

3a. 任何组件-发出事件

import { inject } from 'vue'

export default {
  setup() {
    const emitter = inject("emitter"); // Inject `emitter`
    const mymethod = () => {
      emitter.emit("myevent", 100);
    };
    return {
      mymethod
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

mymethod通过单击按钮或其他方式调用。

3b. 任何组件-监听事件

import { inject } from 'vue'

export default {
  setup() {
    const emitter = inject("emitter");   // Inject `emitter`

    emitter.on("myevent", (value) => {   // *Listen* for event
      console.log("myevent received!", `value: ${value}`);
    });
  },
}
Run Code Online (Sandbox Code Playgroud)

安慰

myevent received! value: 100 
Run Code Online (Sandbox Code Playgroud)