Vue3使用Mitt中央事件总线实现组件之间通讯(发布订阅库)

简介: Vue3使用Mitt中央事件总线实现组件间的发布订阅通信,替代了Vue2中已移除的EventBus。

前言

现在的项目慢慢从 Vue2 升级到 Vue3 了,之前 Vue2 自带的中央事件总线是 EventBus,在 Vue3 中已经被移除了,官方推荐使用 Mitt 发布订阅库。在此简单记录一下 Mitt 的使用方式。

一、导入依赖

npm i mitt -D

二、全局引入

(1)/src/main.ts

// 引入Mitt工具并配置为全局方法
import mitt from 'mitt'
app.config.globalProperties.$mittBus = mitt()

三、示例代码

(1)/src/views/Example/Mitt/index.vue

<template>
  <div class="mitt">
    <h1>
      <span>主页面</span>
      <p><button @click="handleRemoveAEvent">取消订阅A事件</button></p>
      <p><button @click="handleRemoveBEvent">取消订阅B事件</button></p>
      <p><button @click="handleEmitCEvent">发布C事件</button></p>
      <p><button @click="handleRemoveAllEvent">取消订阅所有事件</button></p>
    </h1>

    <div class="mitt-box">
      <emitA class="mitt-box_A" />
      <emitB class="mitt-box_B" />
    </div>
  </div>
</template>

<script setup>
import {
    
     onMounted, onUnmounted, ref, getCurrentInstance } from 'vue'
import emitA from './emit_A.vue'
import emitB from './emit_B.vue'

// 代理对象
const {
    
     proxy } = getCurrentInstance()

// 消息事件总线
const bus = proxy.$mittBus

// 取消订阅A事件
const handleRemoveAEvent = async () => {
    
    
  proxy.$mittBus.off('A_Event')
  console.log('取消订阅A事件 Finished!')
}

// 取消订阅B事件
const handleRemoveBEvent = () => {
    
    
  proxy.$mittBus.off('B_Event')
  console.log('取消订阅B事件 Finished!')
}

// 取消订阅所有事件
const handleRemoveAllEvent = () => {
    
    
  proxy.$mittBus.all.clear()
  console.log('取消订阅所有事件 Finished!')
}

// 发布C事件
const handleEmitCEvent = () => {
    
    
  bus.emit('C_Event', '这是一条来自主页面发布的消息')
}

onMounted(() => {
    
    
  // 订阅A事件
  proxy.$mittBus.on('A_Event', (val) => {
    
    
    console.log('主页面收到一条信息 =>', val)
  })

  // 订阅B事件
  proxy.$mittBus.on('B_Event', (val) => {
    
    
    console.log('主页面收到一条信息 =>', val)
  })
})

onUnmounted(() => {
    
    
  handleRemoveAllEvent()
})
</script>

<style lang="less" scoped>
  .mitt {
    
    
    display: flex;
    flex-direction: column;
    padding: 100px;

    h1 {
    
    
      padding: 20px;
      border: 1px solid #dcdfe6;
      font-weight: lighter;
      text-align: center;
    }

    .mitt-box {
    
    
      flex: 1;
      display: flex;
      flex-direction: row;

      .mitt-box_A {
    
    
        flex: 1;
        border: 1px solid #dcdfe6;
        text-align: center;
        margin: 7px 3.5px 0 0;
        padding: 20px;
      }

      .mitt-box_B {
    
    
        flex: 1;
        border: 1px solid #dcdfe6;
        text-align: center;
        margin: 7px 0 0 3.5px;
        padding: 20px;
      }
    }
  }
</style>

(2)/src/views/Example/Mitt/emit_A.vue

<template>
  <div>
    <h1 style="font-weight: lighter">
      <span>A页面</span>
    </h1>
    <button @click="fn">发布A事件</button>
  </div>
</template>

<script>
export default {
    
    
  data: () => ({
    
    

  }),
  created() {
    
    

  },
  mounted() {
    
    
    this.fn()

    // 订阅C事件
    this.$mittBus.on('C_Event', (val) => {
    
    
      console.log('A页面收到一条信息 =>', val)
    })
  },
  methods: {
    
    
    fn() {
    
    
      // 发布A事件
      const bus = this.$mittBus
      const data = {
    
    
        success: true,
        data: 'OK',
        msg: '这是来自A页面的一条信息'
      }
      bus.emit('A_Event', data)
    }
  }
}
</script>

(3)/src/views/Example/Mitt/emit_B.vue

<template>
  <div>
    <h1 style="font-weight: lighter">
      <span>B页面</span>
    </h1>
    <button @click="fn">发布B事件</button>
  </div>
</template>

<script>
export default {
    
    
  data: () => ({
    
    

  }),
  created() {
    
    

  },
  mounted() {
    
    
    this.fn()

    // 订阅C事件
    this.$mittBus.on('C_Event', (val) => {
    
    
      console.log('B页面收到一条信息 =>', val)
    })
  },
  methods: {
    
    
    fn() {
    
    
      // 发布B事件
      const bus = this.$mittBus
      const data = {
    
    
        success: true,
        data: 'OK',
        msg: '这是来自B页面的一条信息'
      }
      bus.emit('B_Event', data)
    }
  }
}
</script>

四、运行效果

目录
相关文章
|
3月前
|
资源调度 JavaScript 前端开发
Vue3+TypeScript前端项目新纪元:揭秘高效事件总线Mitt,轻松驾驭组件间通信的艺术!
【8月更文挑战第3天】Vue3结合TypeScript强化了类型安全与组件化开发。面对大型应用中复杂的组件通信挑战,可通过引入轻量级事件发射器Mitt实现事件总线模式。Mitt易于集成,通过简单几步即可完成安装与配置:安装Mitt、创建事件总线实例、并在组件中使用`emit`与`on`方法发送及监听事件。此外,利用TypeScript的强大类型系统确保事件处理器正确无误。这种方式有助于保持代码整洁、解耦组件,同时提高应用的可维护性和扩展性。不过,在大规模项目中需谨慎使用,以防事件流过于复杂难以管理。
113 1
|
3月前
|
开发框架 前端开发 JavaScript
在Vue3+TypeScript 前端项目中使用事件总线Mitt
在Vue3+TypeScript 前端项目中使用事件总线Mitt
|
6月前
|
JavaScript 前端开发 API
从入门到项目实战 - VUE组件跨通信:vue2 与 vue3 中实现全局事件总线
从入门到项目实战 - VUE组件跨通信:vue2 与 vue3 中实现全局事件总线
395 0
|
11月前
|
JavaScript
Vue全局事件总线(任意组件间通信)
Vue全局事件总线(任意组件间通信)
|
JavaScript
Vue(Vue2+Vue3)——44.全局事件总线、45.TodoList案例_事件总线
Vue(Vue2+Vue3)——44.全局事件总线、45.TodoList案例_事件总线
|
JavaScript 前端开发 算法
从入门到项目实战 - vue2 与 vue3 中实现全局事件总线
本文介绍 vue2 与 vue3 中实现全局事件总线
401 0
|
JavaScript
【Vue组件间通信】 全局事件总线、订阅与发布
本章学习全局事件总线、订阅与发布。
154 0
【Vue组件间通信】 全局事件总线、订阅与发布
|
JavaScript
「后端小伙伴来学前端了」Vue中利用全局事件总线实现组件之间通信
「后端小伙伴来学前端了」Vue中利用全局事件总线实现组件之间通信
180 0
「后端小伙伴来学前端了」Vue中利用全局事件总线实现组件之间通信
|
JavaScript 前端开发
Vue事件车,非父子组件通讯$bus,$event,中央事件总线
Vue事件车,非父子组件通讯$bus,$event,中央事件总线
200 0
|
1月前
|
JavaScript 调度
Vue事件总线(EventBus)使用指南:详细解析与实战应用
Vue事件总线(EventBus)使用指南:详细解析与实战应用
65 1