【问题标题】:Vue 3 Event Bus with Composition API带有组合 API 的 Vue 3 事件总线
【发布时间】:2021-03-08 21:17:37
【问题描述】:

我已经设置了mitt 并尝试将事件分派给另一个组件,但我遇到了困难,因为在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 composition api 中使用官方推荐的手套?


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

export default {
  mounted() {
    console.log(this.emitter); // works
  }
} 

【问题讨论】:

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


    【解决方案1】:

    要在 Vue 3 组合 API 中使用事件总线,请在 main.js 中使用 Vue 3 的新 provide 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.注入

    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 
    

    【讨论】:

      【解决方案2】:

      您也许可以使用getCurrentInstance 来获取全局属性

      组件:

      import { getCurrentInstance } from 'vue';
      export default {
        setup() {
          // get current instance
          const internalInstance = getCurrentInstance(); 
          // get the emitter from the instance
          const emitter = internalInstance.appContext.config.globalProperties.emitter;
        }
      } 
      

      【讨论】:

      • 这行得通。只是出于好奇,这是与 mitt 和 v3 类似的软件包一起使用的正确方法吗?
      • 我相信是的。这是使用应用程序实例的最简单方法,或者您可以设置外部(全局)发射器。
      猜你喜欢
      • 2021-05-10
      • 2019-07-07
      • 2022-01-18
      • 2020-12-07
      • 2021-11-01
      • 2021-09-04
      • 2022-01-23
      • 2020-12-20
      • 1970-01-01
      相关资源
      最近更新 更多