Vue3 数据总线的实现

 更新时间:2026年04月05日 09:29:01   作者:幻象黑兔  
在Vue3中,可以使用mitt实现事件总线,mitt是一个轻量级的事件发布/订阅库,核心功能包括发布事件、订阅事件和取消订阅,下面就来介绍一下如何使用,感兴趣的可以了解一下

在 Vue 开发中,组件通信 是一个非常重要的主题。对于父子组件之间的通信,我们可以通过 props/emit 来实现。然而,在 非父子组件 或 兄弟组件 之间进行通信时,传统的 props/emit 就显得力不从心了。这时,事件总线(Event Bus) 就派上了用场。

在 Vue 2 中,我们可以通过 new Vue() 创建一个事件总线实例,并使用 $emit$on$off 来实现事件的发布与订阅。然而,在 Vue 3 中,这些 API 被移除了。幸运的是,我们可以借助一个轻量级的开源库 —— mitt 来实现类似的功能。

什么是mitt?

mitt 是一个极简的JavaScript事件发布/订阅库,体积仅有200字节左右,但却功能强大。它可以在任何 JavaScript 环境中使用,包括 Vue、React 甚至原生 JS。mitt 的核心功能非常简单:

  • 发布事件:通过 emit 方法触发事件。
  • 订阅事件:通过 on 方法监听事件。
  • 取消订阅:通过 off 方法移除事件监听器。

如何在 Vue 3 中使用mitt?

1、安装mitt

首先,我们需要通过 npm 安装 mitt

npm i mitt

2、创建事件总线

接下来,我们创建一个事件总线实例

import mitt from "mitt";

const emitter = mitt();
export default emitter;

3、在组件中订阅事件

<template>
  <div>
    <div>Bar: {{ date }}</div>
  </div>
</template>
<script setup lang="ts">
import { onBeforeMount, onMounted, ref } from 'vue';
import emitter from './emitter';

const date = ref()
onMounted(() => {
  emitter.on('bar', (data) => {
    date.value = data
  })
})

onBeforeMount(() => {
  emitter.off('bar')
})
</script>

4、在组件中发布事件

// Foo.vue
<template>
  <div>
    <span>Foo: </span>
    <button @click="click">触发事件</button>
  </div>
</template>
<script setup lang="ts">
import emitter from './emitter';

function click() {
  emitter.emit('bar', new Date().toLocaleString());
}
</script>

mitt实现原理

miit的原理其实非常简单,主要依赖于一个 Map 对象来存储事件类型及其对应的处理函数。以下是mitt的简化实现:

function mitt() {
    const all = new Map();
    return {
        // 订阅事件
        on(type, handler) {
            const handlers = all.get(type)
            if (handlers) {
                handlers.push(handler)
            } else {
                all.set(type, [handler])
            }
        },
        // 取消订阅
        off(type, handler) {
            const handlers = all.get(type)
            if (!handlers) {
                return
            }
            if (handler) {
                const index = handlers.indexOf(handler)
                if (index > -1) {
                    handlers.splice(index, 1)
                }
            } else {
                all.set(type, [])
            }
        },
        // 发布事件
        emit(type, ...args) {
            const handlers = all.get(type);
            handlers?.slice().map(handler => {
                handler(...args)
            })
        }
    }
}

到此这篇关于Vue3 数据总线的实现的文章就介绍到这了,更多相关Vue3 数据总线内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Ant Design Vue table中列超长显示...并加提示语的实例

    Ant Design Vue table中列超长显示...并加提示语的实例

    这篇文章主要介绍了Ant Design Vue table中列超长显示...并加提示语的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Vue3实现计算属性的代码详解

    Vue3实现计算属性的代码详解

    计算属性对于前端开发来说算是经常使用的一个能力了,本文将从代码层面来给大家介绍下Vue3是如何实现计算属性的,需要的朋友可以参考下
    2023-07-07
  • vue实现引入本地json的方法分析

    vue实现引入本地json的方法分析

    这篇文章主要介绍了vue实现引入本地json的方法,结合实例形式分析了vue.js加载本地json文件及解析json数据相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • Vue中如何实现在线预览word文件、excel文件

    Vue中如何实现在线预览word文件、excel文件

    这篇文章主要介绍了Vue中如何实现在线预览word文件、excel文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 基于Vue实现拖拽功能

    基于Vue实现拖拽功能

    这篇文章主要为大家详细介绍了Vue实现拖拽功能,拖动方块进行移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • 详解vue3自定义指令实现 v-focus 功能

    详解vue3自定义指令实现 v-focus 功能

    在Vue3中,可以通过自定义指令来实现v-focus功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-05-05
  • element-ui form表单的动态rules校验功能实现

    element-ui form表单的动态rules校验功能实现

    在vue项目中,有时候可能会用到element-ui form表单的动态rules校验,这篇文章主要介绍了element-ui form表单的动态rules校验,我们可以巧妙的运用element-ui form表单里面form-item的校验规则来处理,本文结合实例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • el-input输入校验不能为空格以及不能输入全部为空的内容

    el-input输入校验不能为空格以及不能输入全部为空的内容

    这篇文章主要给大家介绍了关于el-input输入校验不能为空格以及不能输入全部为空的内容的相关资料,el-input验证规则主要是为了确保输入的内容符合特定的要求,需要的朋友可以参考下
    2023-10-10
  • vue.js中导出Excel表格的案例分析

    vue.js中导出Excel表格的案例分析

    这篇文章主要介绍了vue.js中如何导出Excel表格,在项目中经常会遇到这样的需求,今天小编分步骤通过实例代码给大家详细介绍,需要的朋友可以参考下
    2019-06-06
  • vue中ant-design-vue组件的安装与使用

    vue中ant-design-vue组件的安装与使用

    Ant Design Vue是使用Vue实现的遵循Ant Design设计规范的高质量UI组件库,用于开发和服务于企业级中后台产品,下面这篇文章主要给大家介绍了关于vue中ant-design-vue组件安装与使用的相关资料,需要的朋友可以参考下
    2022-04-04

最新评论