tnblog
首页
视频
资源
登录

vue3 跨组件方法调用。Vue 3 的 Provide / Inject 与 mitt

1605人阅读 2024/9/15 22:37 总访问:891941 评论:0 收藏:0 手机
分类: 前端

mitt 是一个轻量级的事件发射器(event emitter),它可以很容易地集成到 Vue 3 应用中。

下面是一个使用 Vue 3 的 provide/inject 和 mitt 来实现跨组件事件通信的简单示例:

安装 mitt

首先,你需要在你的项目中安装 mitt。如果你使用的是 npm 或 yarn,可以通过以下命令来安装:

  1. npm install mitt --save
  2. # 或者
  3. yarn add mitt

创建一个事件总线

在你的项目中,你可以创建一个单独的文件来管理 mitt 实例,这个实例将作为事件总线。

eventBus.js

  1. import mitt from 'mitt';
  2. export const eventBus = mitt();

在 Vue 应用中提供事件总线

然后,在你的 Vue 应用或某个祖先组件中,你可以使用 provide 来提供这个事件总线实例。

main.js 或某个祖先组件

  1. import { createApp } from 'vue';
  2. import App from './App.vue';
  3. import { eventBus } from './eventBus';
  4. const app = createApp(App);
  5. // 在整个应用中提供 eventBus
  6. app.provide('eventBus', eventBus);
  7. app.mount('#app');

注意:在 Vue 3 中,provide 通常是在 setup 函数中使用的,但如果你想在整个应用范围内提供某些东西,可以像上面这样在创建应用实例时调用 app.provide。

在组件中注入并使用事件总线

现在,你可以在任何子组件中通过 inject 来注入并使用这个事件总线了。

ComponentA.vue

  1. <template>
  2. <button @click="emitEvent">Emit Event</button>
  3. </template>
  4. <script setup>
  5. import { inject } from 'vue';
  6. // import { eventBus } from './eventBus'; // 注意:通常不需要直接导入,因为已经通过 provide 提供了。可以直接通过inject 获取 eventBus
  7. // 通过 inject 获取 eventBus
  8. const eventBus = inject('eventBus');
  9. // 定义一个方法来触发事件
  10. function emitEvent() {
  11. if (eventBus) {
  12. eventBus.emit('my-event', { message: 'Hello from Component A!' });
  13. }
  14. }
  15. </script>

ComponentB.vue

  1. <template>
  2. <div>
  3. <p>Received message: {{ message }}</p>
  4. </div>
  5. </template>
  6. <script setup>
  7. import { inject, ref, onUnmounted } from 'vue';
  8. // 通过 inject 获取 eventBus
  9. const eventBus = inject('eventBus');
  10. // 创建一个响应式引用来存储接收到的消息
  11. const message = ref('');
  12. // 监听 my-event 事件
  13. if (eventBus) {
  14. eventBus.on('my-event', (data) => {
  15. message.value = data.message;
  16. });
  17. // 在组件卸载时移除监听器,防止内存泄漏
  18. onUnmounted(() => {
  19. eventBus.off('my-event');
  20. });
  21. }
  22. </script>

注意事项

  • 确保你的 eventBus 已经在 Vue 应用的根级别(如 main.js 或 main.ts)通过 app.provide 被提供。
  • 在任何子组件中,你都可以通过 inject 来获取并使用这个 eventBus。
  • 当你不再需要监听某个事件时(例如在组件卸载时),应该使用 eventBus.off 来移除监听器,以防止内存泄漏。这在 ComponentB.vue 的示例中已经展示过了。
  • 如果你发现 inject 返回的是 undefined,那么可能是因为 provide 没有在组件的祖先链中被正确调用,或者 provide 和 inject 的键名不匹配。

666


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价
这一生多幸运赶上过你.
排名
8
文章
243
粉丝
7
评论
7
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术