vue3+TypeScript全局事件总线mitt

news/2025/1/12 5:02:25/

在vue3中 $ on,$off 和 $once 实例方法已被移除,组件实例不再实现事件触发接口,因此大家熟悉的EventBus便无法使用了。然而我们习惯了使用EventBus,对于这种情况我们可以使用Mitt库

npm i mitt -S

首先要在全局挂载 mitt

在app.config.globalProperties上挂在$Bus

使用ts必须要拓展ComponentCustomProperties类型才能获得类型提示

main.ts

import { createApp } from 'vue'
import './style.scss'
import App from './App.vue'
import mitt from 'mitt'const Mit = mitt()
const app = createApp(App)//TypeScript注册
// 由于必须要拓展ComponentCustomProperties类型才能获得类型提示
declare module 'vue' {export interface ComponentCustomProperties {$Bus: typeof Mit}
}
//vue3挂载全局API
app.config.globalProperties.$Bus = Mit
app.mount('#app')

A.vue

在A中派发事件
getCurrentInstance是为了获取当前的组件实例
获取到当前组件的实例后,就可以在实例上的proxy获取到我们全局绑定的$Bus了

<template><div class="A">A<button @click="emitA"> 派发一个事件</button></div>
</template><script setup lang="ts">
import { getCurrentInstance } from 'vue'
const instance = getCurrentInstance()const emitA = () => {instance?.proxy?.$Bus.emit('on-EmitA', 'mitt')instance?.proxy?.$Bus.emit('on-EmitA2','mitt2')
}
</script><style lang="scss" scoped>
.A {width: 200px;height: 200px;background-color: aqua;.children {display: flex;justify-content: space-between;}
}
</style>

B 中就可以监听到事件了
.on的第一个参数是事件的名称 这样可以一次监听一个事件
第一个参数传入 * 即监听全部事件 此时回调函数传入的第一个参数接受绑定的事件名称,第二个参数接受传入的参数
B.vue

<template><div class="B">B<br></div>
</template><script setup lang="ts">
import { getCurrentInstance } from 'vue'
const instance = getCurrentInstance()const Bus = (str: any) => {console.log('b=====>str', str)
}
instance?.proxy?.$Bus.on('on-EmitA', Bus)//监听一个//同样的也有off方法
instance?.proxy?.$Bus.off('on-EmitA', Bus)instance?.proxy?.$Bus.all.clear()//清楚全部事件// instance?.proxy?.$Bus.on('*', (type, str) => {
//   console.log(type, 'b=====>str', str)
// })//监听多个
</script><style lang="scss" scoped>
@import '../style.scss';.B {width: 200px;height: 200px;background-color: $cloud-water;
}
</style>


http://www.ppmy.cn/news/1270836.html

相关文章

2023版本QT学习记录 -2- 标准文件对话框

头文件的使用 #include "QFileDialog"函数原型 getOpenFileName效果 参数 未完待续

SpringBoot 究竟是如何跑起来的

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《SpringBoot》。&#x1f3af;&#x1f3af; &…

Cglib动态代理从入门到掌握

Cglib 动态代理 本文的写作目的是为了探究 Spring 框架中在使用Transactional标注的方法中使用 this 进行自调用时事务失效的原因&#xff0c;各种视频教程中只是简单指出 this 指向的不是代理类对象&#xff0c;而是目标类对象&#xff0c;但是并没有解释为什么 this 不是代理…

12.4~12.14概率论复习与相应理解(学习、复习、备考概率论,这一篇就够了)

未分配的题目 概率计算&#xff08;一些转换公式与全概率公式&#xff09;与实际概率 &#xff0c;贝叶斯 一些转换公式 相关性质计算 常规&#xff0c;公式的COV与P 复习相关公式 计算出新表达式的均值&#xff0c;方差&#xff0c;再套正态分布的公式 COV的运算性质 如…

laravel使用ajax登录,和自定义生成验证码

使用larave框架操作ajax发送get请求&#xff0c;和自义定验证码 1. 后端登录代码 <?phpnamespace CriusWeb\FzUserAdmin\Http\Controllers;use App\Models\Admin; use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Routing\Controller; use I…

VRRP协议详解

目录 一、基础概念 1、概念 2、VRRP的基本结构 状态机 二、VRRP主备备份工作过程 1、备份工作过程 2、VRRP的负载分担工作 三、实验 一、基础概念 1、概念 VRRP能够在不改变组网的情况下&#xff0c;将多台路由器虚拟成一个虚拟路由器&#xff0c;通过配置虚拟路由器的I…

Vue 子传父 组件传参 defineEmits

defineEmits 属性&#xff1a;用于创建自定义事件&#xff0c;接收子组件传递过来的数据。 注意&#xff1a;如果自定义事件的名称&#xff0c;和原生事件的名称一样&#xff0c;那么只会触发自定义事件。 defineEmits 仅适用于 setup 语法糖&#xff0c;其它写法请见&#x…

oracle怎么导入dmp文件??????

目录 oracle怎么导入dmp文件&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f; 先看&#xff1a; 方法一&#xff1a;【推荐】 winR输入 输入&#xff1a; 检验&#xff1a; 导入成功&#xff01; 方法二&#xff1a; 直接在 PLSQL Developer…