Vue2 和 Vue3中EventBus使用差异

news2024/12/28 8:43:36

目录

    • 前言
    • 一、EventBus 和 mitt 的对比
    • 二、Vue 2 中的 EventBus 使用实例
      • 2.1 创建 EventBus
      • 2.2 在组件中使用 EventBus
        • 2.2.1 组件 A - 发送事件
        • 2.2.2 组件 B - 监听事件
      • 2.3 注意事项
    • 三、Vue 3 中的 mitt 使用实例
      • 3.1 安装 mitt
      • 3.2 创建 mitt 实例
      • 3.3 在组件中使用 mitt
        • 3.3.1 组件 A - 发送事件
        • 3.3.2 组件 B - 监听事件
      • 3.4 mitt 的优点
    • 四、总结

前言

在前端开发中,组件之间的通信是一个非常重要的话题。Vue.js 提供了多种方式来实现这一点,本文将重点介绍在 Vue 2 中使用 EventBus 和在 Vue 3 中使用 mitt 来实现组件间通信的方式。


在这里插入图片描述

正文开始如果觉得文章对您有帮助,请帮我三连+订阅,谢谢💖💖💖


一、EventBus 和 mitt 的对比

特性Vue 2 EventBusVue 3 mitt
实现方式Vue 实例第三方库 mitt
使用复杂度简单简单
性能较好更好
内存管理需要手动管理事件监听提供 all.clear() 清除所有监听器
API 简洁性较多 API更简洁的 API
全局性全局 Vue 实例,容易混乱mitt 实例,可多实例管理

二、Vue 2 中的 EventBus 使用实例

在 Vue 2 中,EventBus 是一种常见的非父子组件之间的通信方式。EventBus 本质上是一个空的 Vue 实例,通过它可以在不同组件之间传递事件和数据。

EventBus 的API

  • $emit(eventName, [...args]): 触发一个事件,附带参数。
  • $on(eventName, callback): 监听一个事件,当事件触发时执行回调。
  • $off(eventName, callback): 移除事件监听。

eventBus 可以通过使用特殊的事件名 "*" 来监听所有事件。这通常在调试或需要全局监听所有事件的情况下使用

2.1 创建 EventBus

首先,我们需要创建一个 EventBus 实例,通常我们会在一个独立的文件中创建它:

// eventBus.js
import Vue from 'vue';
export const EventBus = new Vue();

2.2 在组件中使用 EventBus

2.2.1 组件 A - 发送事件
// ComponentA.vue
<template>
  <button @click="sendEvent">发送事件</button>
</template>

<script>
import { EventBus } from './eventBus';

export default {
  methods: {
    sendEvent() {
      EventBus.$emit('updateMessage', '组件A的消息。。。123');
    }
  }
}
</script>
2.2.2 组件 B - 监听事件
// ComponentB.vue
<template>
  <div>接收到的消息: {{ message }}</div>
</template>

<script>
import { EventBus } from './eventBus';

export default {
  data() {
    return {
      message: ''
    };
  },
  created() {
    EventBus.$on('updateMessage', (data) => {
      this.message = data;
    });
    /* 监听所有事件 */
    // EventBus.$on('*', ()=>{.....});
  },
  /* 组件卸载时记得释放内存  */
  beforeDestroy() {
    EventBus.$off('updateMessage');
    // 取消所有事件
    // EventBus.$off('*', ()=>{.....});
  }
}
</script>

2.3 注意事项

  • 内存泄漏:在组件销毁时需要手动移除事件监听。
  • 全局性:EventBus 是全局的,这意味着在大型应用中可能会导致事件管理混乱。

三、Vue 3 中的 mitt 使用实例

Vue 3 中不再推荐使用 Vue 实例作为 EventBus,而是建议使用第三方库 mitt 来进行事件总线管理。mitt 是一个轻量级的事件库,体积小、性能高。

mitt 的 API介绍:

  • emit(type, event): 触发一个事件,传递数据。
  • on(type, handler): 监听一个事件。
  • off(type, handler): 移除事件监听。
  • all.clear(): 清除所有事件监听器。

3.1 安装 mitt

首先需要安装 mitt

npm install mitt

3.2 创建 mitt 实例

// eventBus.js
import mitt from 'mitt';
export const emitter = mitt();

typescript 类型设置

// eventBus.ts
import mitt from 'mitt'

type Event = {
  // 用于Message 更新通知
  updateMessage: any
}

const emitter = mitt<Event>()
export default emitter

3.3 在组件中使用 mitt

3.3.1 组件 A - 发送事件
// ComponentA.vue
<template>
  <button @click="sendEvent">发送事件</button>
</template>

<script>
import { emitter } from './eventBus';

export default {
  methods: {
    sendEvent() {
      emitter.emit('updateMessage', '组件A的消息。。。123');
    }
  }
}
</script>
3.3.2 组件 B - 监听事件
// ComponentB.vue
<template>
  <div>接收到的消息: {{ message }}</div>
</template>

<script>
import { emitter } from './eventBus';

export default {
  data() {
    return {
      message: ''
    };
  },
  mounted() {
    /* 监听具体事件 */
    emitter.on('updateMessage', (data) => {
      this.message = data;
    });
    /* 监听所有的事件 */
    emitter.on('*', (data) => {
      this.message = data;
    });

  },
  beforeUnmount() {
    emitter.off('updateMessage');
    /* 取消所有事件 */
    //emitter.all.clear()
  }
}
</script>

3.4 mitt 的优点

  • 轻量级:mitt 是一个小型库,适合在大型项目中使用。
  • 简洁 API:API 简洁明了,易于使用。
  • 无依赖:mitt 不依赖 Vue,可以在任意 JavaScript 项目中使用。

四、总结

在 Vue 2 中,使用 EventBus 是一种方便的方式来实现非父子组件之间的通信,但需要注意内存管理问题。在 Vue 3 中,推荐使用 mitt,它提供了更轻量级、性能更高的解决方案,并且 API 更加简洁易用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2040962.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【笔记】MSPM0G3507开发环境搭建——MSPM0G3507与RT_Thread(一)

环境搭建大体过程就不再赘述了&#xff0c;本文记录一下我刚开始搭建环境时踩过的坑以及一些不太懂的地方。后边会出MSPM0G3507RT-Thread 3.1.5相关的教程&#xff0c;感兴趣记得点点关注。 本篇使用立创地猛星MSPM0G3507开发板 参考文章&#xff1a; 【学习笔记一】搭建MSPM…

几种Word Embedding技术详解

NLP 中的词嵌入是一个重要术语&#xff0c;用于以实值向量的形式表示用于文本分析的单词。这是 NLP 的一项进步&#xff0c;提高了计算机更好地理解基于文本的内容的能力。它被认为是深度学习在解决具有挑战性的自然语言处理问题方面最重要的突破之一。 在这种方法中&#xff…

视觉SLAM中的数学基础:李群与李代数

在视觉SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;中&#xff0c;理解和应用李群&#xff08;Lie Group&#xff09;与李代数&#xff08;Lie Algebra&#xff09;是非常关键的。李群与李代数为描述和处理空间中的连续变换&#xff08;如旋转和平移&am…

【OCR 学习笔记】二值化——局部阈值方法

二值化——局部阈值方法 自适应阈值算法Niblack算法Sauvola算法 自适应阈值算法 自适应阈值算法1用到了积分图&#xff08;Integral Image&#xff09;的概念。积分图中任意一点 ( x , y ) (x,y) (x,y)的值是从图左上角到该点形成的矩形区域内所有值的和。即&#xff1a; I (…

逻辑回归之鸢尾花数据集多分类任务

目录 1.导入数据 2.定义多分类模型 3.准备测试数据 4.绘制决策边界 对于多分类任务&#xff0c;其实就是多个二分类任务。 先分黑色(标签为1)和其他(标签为0)&#xff0c;在这个基础上再去分红色和绿色&#xff0c;此时就将红色标签设置为1&#xff0c;其他设置为0&#x…

关于 Lora中 Chirp Spread Spectrum(CSS)调制解调、发射接收以及同步估计的分析

本文结合相关论文对CSS信号的数学形式、调制解调、发射接收以及同步估计做了全面分析&#xff0c;希望有助于更好地理解lora信号 long-range (LoRa) modulation, also known as chirp spread spectrum (CSS) modulation, in LoRaWAN to ensure robust transmission over long d…

Unity(2022.3.38LTS) - 页面介绍

目录 A. 创建项目 B.Unity 编辑器页面 C. 自己点点 A. 创建项目 有多个编辑器版本的选择编辑器. 3D和2D的区别就是初始化的包不同,这些包打开项目之后都可以在自行下载,随意切换, B.Unity 编辑器页面 Unity 编辑器页面是一个高度集成且功能丰富的开发环境&#xff0c;为游…

ISE14.7后仿真、烧录教程

ISE14.7后仿真、烧录教程 ISE14.7后仿真、烧录教程 系统版本&#xff1a;win10&#xff0c;EDA工具版本&#xff1a;ISE14.7&#xff0c;modelsim SE 10.4&#xff0c;本文主要包含两部分内容&#xff0c;首先是基于ISE的后仿真&#xff0c;基于ISE和modelsim的联合后仿真&am…

C++简单界面设计

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {---------------------窗口设置----------------------this->setWindowTitle("南城贤子摄影工作室");//设置窗口标题this->setWindowIcon(QIcon("d:\\Pictures\\C…

上海悠远为您解析芯片管理系统的核心功能

在当今科技日新月异的时代&#xff0c;芯片作为信息技术的基石&#xff0c;其管理效率与安全性直接关系到整个系统的稳定运行与数据安全。因此&#xff0c;一个高效、智能的芯片管理系统成为了不可或缺的技术支撑。该系统通过集成多项核心技术&#xff0c;实现了对芯片从生产到…

统信UOSV20 安装redis

在线安装 在统信软件&#xff08;UOS&#xff09;上使用yum安装Redis&#xff0c;可以按照以下步骤进行&#xff1a; 打开终端。首先添加Redis的官方仓库&#xff0c;可以使用以下命令&#xff1a; sudo yum install epel-release安装Redis&#xff1a; sudo yum install r…

简单的spring boot tomcat版本升级

简单的spring boot tomcat版本升级 1. 需求 我们使用的springboot版本为2.3.8.RELEASE&#xff0c;对应的tomcat版本为9.0.41&#xff0c;公司tomcat对应版本发现攻击者可发送不完整的POST请求触发错误响应&#xff0c;从而可能导致获取其他用户先前请求的数据&#xff0c;造…

c# 直接使用c++ 类库文件

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

基于JSP的足球赛会管理系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSPJavaBeansServlet 工具&#xff1a;Eclipse、Navicat、Maven 系统展示 首页 管理员功能模块 用…

Linux:动态库和静态库

静态库与动态库 A&#xff1a;静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。 B&#xff1a;动态库&#xff08;.so&#xff09;&#xff1a;程序在运行的时候才去链接动态库的代码&#…

Ubuntu24.04设置国内镜像软件源

参考文章&#xff1a; Ubuntu24.04更换源地址&#xff08;新版源更换方式&#xff09; - 陌路寒暄 一、禁用原来的软件源 Ubuntu24.04 的源地址配置文件发生改变&#xff0c;不再使用以前的 sources.list 文件&#xff0c;升级 24.04 之后&#xff0c;该文件内容变成了一行注…

Java | Leetcode Java题解之第334题递增的三元子序列

题目&#xff1a; 题解&#xff1a; class Solution {public boolean increasingTriplet(int[] nums) {int n nums.length;if (n < 3) {return false;}int first nums[0], second Integer.MAX_VALUE;for (int i 1; i < n; i) {int num nums[i];if (num > second…

日常网站优化:SEO的6项目日常例行工作

大部分人每天都会登录自己的网站&#xff0c;或者至少每周登录一次。但是&#xff0c;如果你是一家小企业或者团队的负责人&#xff0c;你可能会有很多其他的工作要做&#xff0c;相对的&#xff0c;就没有那么多的时间可以花在SEO上。 当然您也可以选择一个专业的团队&#x…

差异对比:云服务器PK物理服务器

【若您对以下内容感兴趣&#xff0c;欢迎联系或关注我们】 在服务器领域&#xff0c;云服务器和物理服务器是两种常见的选择&#xff0c;它们在多个方面存在明显的区别。 一、资源虚拟化 云服务器&#xff1a;基于物理服务器通过虚拟化技术构建而成&#xff0c;多个虚拟服务…

flutter 画转盘

import package:flutter/material.dart; import dart:math;const double spacingAngle 45.0; // 每两个文字之间的角度 // 自定义绘制器&#xff0c;ArcTextPainter 用于在圆弧上绘制文字 class ArcTextPainter extends CustomPainter {final double rotationAngle; // 动画旋…