tnblog
首页
视频
资源
登录

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

1402人阅读 2024/9/15 22:37 总访问:847202 评论: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)

评价

vue3,vue组件,props给一个对象参数。vue组件间传参数vue父组件给子组件传参数。组件参数类型。父组件调用子组件方法。vue组件事件监听,给子组件传递方法,子组件调用父组件方法

[TOC]组件可以使用props给组件传值,可以同时传递多个,可以是任意类型,比如字符串或者对象。 下面是个简单的例子: &lt...

vue3最基础数据加载,表格table

vue3表格加载一点静态数据 &lt;template&gt; &lt;el-table :data=&quot;tableData&quot; style=&quot;width: 100%&quot...

vue3 Element Plus 表单输入框放到一行

当垂直方向空间受限且表单较简单时,可以在一行内放置表单。 通过设置 inline 属性为 true 可以让表单域变为行内的表单域...

vue3 Element ui Plus 表格 分页,vue3 el-pagination分页

其实就是el-pagination控件的使用而已 &lt;template&gt; &lt;div&gt; &lt;el-table :data=&quot;tableData&quot; ...

vue触发a标签点击事件。vue3 dom操作 触发点击事件 。文件选择库只会触发一次change事件问题

[TOC]vue触发a标签的点击事件直接操作dom节点的方式比较简单 &lt;button @click=&quot;handleBtnClick&quot;&gt;点击按钮&...

vue3 ref使用多个ref使用。通过ref触发点击事件

多个ref获取的方法可以使用一样的,通过变量名来区分就行了 const vabUploadRef = ref() const multipleTableRef = ref() ...

vue elementui,vue3 element plus 文件上传时候设置其他参数。后台.net接收传递额外参数。图片上传

比如上传文件的时候额外传递两个select选择的值 前台前面上传文件的时候要提供默认参数很简单,el-upload绑定一个data即可...

vue,vue3 打开新页面,页面跳转。vue跳转到一个新页面。vue路由传参,vue3路由传参,vue3 获取路由参数

[TOC]VUE页面跳转本地页面跳转 goApplicationCenter() { //进行页面跳转 let path = &quot;/application-center&quo...

vuevue3组件封装,vue组件模板。简单组件模板。基础组件模板。vue引入自定义组件。vue使用自定义组件。插槽slot使用。vue封装格子效果,一块一块grid布局效果

[TOC]vue封装组件的简单模板贴一个简单模板方便自定义组件的时候直接复制 &lt;template&gt; &lt;div class=&quot;app...

.net6 Signalr+vue3 运用(上)

.net6 Signalr+Vue3 的运用(上)[TOC] 什么是 SignalR?ASP.NET Core SignalR 是一个开放源代码库,可用于简化向应用添加...

.net6 Signalr+vue3 运用(下)

.net6 Signalr+Vue3 的运用(下)[TOC] 上篇链接:https://www.tnblog.net/hb/article/details/7961SignalR 中的用户 Sig...

.net6 Signalr+vue3 配合Ingress Nginx运用

.net6 Signalr+Vue3 配合Ingress Nginx的运用[TOC] 结合上篇:https://www.tnblog.net/hb/article/details/7963 项目打...

vue3 Element Plus 表格使用vue3常用界面搭配。vue3基础模板使用

一个简单的表格加时间搜索界面效果如下: 代码如下: &lt;template&gt; &lt;div class=&quot;app-container&quot;&g...

vue3 如何加prototype。vue3使用globalProperties

在2.X版本中创建一个vue 实例是通过 new Vue()来实现的,到了3.X中则是通过使用createApp这个 API返回一个应用实例,并且可...
这一生多幸运赶上过你.
排名
8
文章
231
粉丝
7
评论
7
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术