vue3中如何实现事件总线eventBus

news/2024/7/10 2:47:09 标签: 前端, javascript, vue.js, vue

使用插件

由于vue3中 “$ on”,$ off 和 $ once 实例方法已被移除,组件实例不再实现事件触发接口 所以我们可以使用官方推荐的这个第三方库实现同样的效果
mitt https://github.com/developit/mitt

安装

pnpm install mitt -S

挂载全局写法

main.ts 初始化
全局总线,vue 入口文件 main.js 中挂载全局属性

import './assets/main.css'

import { createApp } from 'vue'
import { createPinia } from 'pinia'

import App from './App.vue'
import router from './router'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
// 引入animate动画
import 'animate.css';
//挂载事务总线
import mitt from 'mitt'
const app = createApp(App)
const miTT = mitt()
//TypeScript注册
// 由于必须要拓展ComponentCustomProperties类型才能获得类型提示
declare module "vue" {
  export interface ComponentCustomProperties {
      $bus: typeof miTT
  }
}

app.config.globalProperties.$bus = miTT

app.use(createPinia())
app.use(router)
app.use(ElementPlus)
app.mount('#app')

父组件

<template>
  <A></A>
  <B></B>
</template>

<script setup lang="ts">
import A from './components/A.vue'
import B from './components/B.vue'
</script>

<style scoped>

</style>

组件A

<template>
  <div style="margin-right: 30px;">
    <h1>派发组件</h1>
     <button @click="emitIndex">派发事件</button>
  </div>
</template>

<script setup lang="ts">
import { getCurrentInstance } from 'vue'
// vue实例
const vm = getCurrentInstance();
 const emitIndex = () => {
  // self.console.log(123,vm)
  vm?.proxy?.$bus.emit('on-click', 1)
 }
</script>

<style scoped>

</style>

组件B

<template>
  <div>
   <h1>接收组件</h1>
   <div>接收的值{{ bData }}</div>
  </div>
 </template>
 
 <script setup lang="ts">
 import { getCurrentInstance,ref } from 'vue'
  const vm = getCurrentInstance()
  let bData = ref<Number>(0)
  vm?.proxy?.$bus.on('on-click', (num) => {
      bData.value += num
      console.log(num,'===========>B')
  })
 </script>
 
 <style scoped>
 
 </style>
 

效果如下

点击 按钮 b组件中的数值增加

在这里插入图片描述
监听所有事件( on(“*”) )

vm?.proxy?.$bus.on('*', (num) => {
      bData.value += num
      console.log(num,'===========>B')
  })

移除监听事件(off)

vm?.proxy?.$Bus.on('on-click',Fn)//listen
vm?.proxy?.$Bus.off('on-click',Fn)//unListen

清空所有监听(clear)

vm?.proxy?.$Bus.all.clear() 

http://www.niftyadmin.cn/n/5239608.html

相关文章

阻塞队列(生产者消费者问题)

阻塞队列是一种特殊的队列&#xff0c;它支持在队列满或者空时阻塞线程。在多线程编程中&#xff0c;阻塞队列是一种常用的同步工具&#xff0c;可以用来实现生产者-消费者模型等多线程协作场景。 1. 基本原理 阻塞队列是一种线程安全的队列&#xff0c;它支持在队列满或者空…

Mabatis处理异常屏蔽SQL返回前端全局异常捕获处理

文章目录 Mabatis处理异常屏蔽SQL返回前端全局异常捕获处理结论1 java异常体系2 Spring框架异常处理3 定位Spring框架转化为哪种unchecked异常3.1 捕获RuntimeException定位Spring框架转化抛出的异常类3.2 进一步查看包名判断3.3 识别MyBatisSystemException下级实现3.3 识别My…

基于 springboot + vue 健身房管理系统 毕业设计-附源码

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

Scrum冲刺计划

Scrum Sprint Planning&#xff08;Scrum冲刺计划&#xff09;这个事件会发生在一个Sprint的起动阶段。这个事件会产生Scrum 冲刺计划。 这个事件一般由Product Owner&#xff08;或其代表&#xff09;来主持。Product Owner要确保参与者已准备好了讨论Product Backlog&#x…

人工智能-机器翻译:技术发展与代码实战

在本文中&#xff0c;我们深入探讨了机器翻译的历史、核心技术、特别是神经机器翻译&#xff08;NMT&#xff09;的发展&#xff0c;分析了模型的优化、挑战及其在不同领域的应用案例。同时&#xff0c;我们还提出了对未来机器翻译技术发展的展望和潜在的社会影响。 关注TechLe…

『渗透测试基础』| 什么是渗透测试?有哪些常用方法?如何开展?测试工具有哪些?优势在哪里?

『渗透测试基础』| 什么是渗透测试&#xff1f;有哪些常用方法&#xff1f;如何开展&#xff1f;测试工具有哪些&#xff1f;优势在哪里&#xff1f; 1 什么是渗透测试&#xff1f;2 有哪些常用方法&#xff1f;2.1 针对性测试2.2 外部测试2.3 内部测试2.4 盲测2.5 双盲测试 3 …

【Centos】Crontab新手教程:轻松掌握定时任务管理

Crontab新手教程&#xff1a;轻松掌握定时任务管理 引言 Crontab&#xff08;定时任务&#xff09;是Linux系统中一个强大而灵活的工具&#xff0c;它允许用户按照预定的时间计划执行任务。对于初学者来说&#xff0c;掌握Crontab是必备的技能之一。本教程将引导您从零开始学…

SELinux零知识学习三十八、SELinux策略语言之约束(2)

接前一篇文章:SELinux零知识学习三十七、SELinux策略语言之约束(1) 四、SELinux策略语言之约束 SELinux对策略允许的访问提供了更严格的约束机制,不管策略的allow规则如何。 SELinux有两种类型的约束: constrain语句constrain语句是最常见的约束,使得可以基于用户、角色…