javascript - 带有组合 API 的 Vue 3 事件总线

标签 javascript vue.js vuejs3 event-bus vue-composition-api

我已设置 mitt并尝试将事件分派(dispatch)给另一个组件,但我很难,因为在 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);
在组件中,我想调度一个事件
export default {
   setup() {
      function toggleSidebar() {
          this.emitter.emit('toggle-sidebar');

          console.log(this); // binds to setup(), not the vue instance.
      }
   }
}
this不存在,我无法访问 .emitter .我错过了什么?如何在 Vue 3 组合 API 中使用官方建议的手套?

顺便说一句,如果我使用 v2 语法,我可以访问 this.emitter .但我对组合 API 方式很好奇
export default {
  mounted() {
    console.log(this.emitter); // works
  }
} 

最佳答案

要在 Vue 3 组合 API 中使用事件总线,请使用 Vue 3 的新 provide main.js 中的 api,然后 inject 在任何组件中:
1.安装mitt :

npm install mitt
2.提供:
main.js
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');
3. 注入(inject)
3a。任何组件 - 发射一个事件
import { inject } from 'vue'

export default {
  setup() {
    const emitter = inject('emitter'); // Inject `emitter`
    const mymethod = () => {
      emitter.emit('myevent', 100);
    };
    return {
      mymethod
    }
  }
}
调用 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}`);
    });
  },
}
安慰
myevent received! value: 100 

关于javascript - 带有组合 API 的 Vue 3 事件总线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66537320/

相关文章:

Vue.js 在 ajax 请求期间禁用组件

vue.js - Vuetify 如何在所有验证规则都为真之前禁用按钮?

vue.js - Vue 3 - 全局 axios 实例

javascript - 为什么 Vue3 中的空对象没有反应性?

javascript - Webpack:获取目录中所有文件名的映射

xml - 如何在 Vue Js 中嵌入 XML RSS 文件?

javascript - myObservableArray.length 和 myObservableArray().length 之间的区别

vue-router - TypeScript 安全路由名称?

javascript - 如何在 javascript 中循环遍历 xmlhttprequest

javascript - 如何在 nightwatchjs 中使用执行