Vue2 和 Vue3中EventBus使用差异

目录

    • 前言
    • 一、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 更加简洁易用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DHU OJ 二维数组

思路及代码 #include<iostream> using namespace std; int main(){ //input 多组 //input M,N int 1< <20 //input M 行 N 列 数据 //initialize listint M, N;while (cin >> M >> N){int list[M][N];for (int i 0; i < M-1; i){for (int j 0; j…

Python编写Word文档

目录 0. 安装依赖 1. 创建word文档 2. 添加标题、居中、字体16大小 3. 添加标题一 4. 添加一段话并设置字体颜色 封装函数 5. 换页 6. 插入表格 0. 安装依赖 python-docx1.1.2 1. 创建word文档 from docx import Documentdoc Document() 2. 添加标题、居中、字体1…

计算机网络面试题汇总

文章目录 计算机网络基础计算机网络体系结构(网络分层模型)OSI 七层模型是什么?每一层的作用是什么?TCP/IP 四层模型是什么?每一层的作用是什么?五层体系结构以及对应的协议为什么网络要分层,分层的好处?常见网络协议有哪些,每一层常见协议有哪些?应用层有哪些常见的协…

24/8/18算法笔记 目标导向强化学习

目标导向强化学习&#xff08;Goal-Oriented Reinforcement Learning&#xff0c;简称GORL&#xff09;是强化学习的一个分支&#xff0c;它关注于智能体如何通过与环境的交互来实现特定的目标或任务。与传统的强化学习不同&#xff0c;目标导向强化学习更加关注目标的设定和达…

一元二次方程系数

前言&#xff1a;刚刚开始写的时候也想到了先求出两个的解&#xff0c;但是没想到最后正负数系数怎么处理 且我才知道求解gcd是可以负数和正数的 #include<bits/stdc.h> using namespace std;#define int long long int t; int a,b,c;void solve(){cin >> a >&…

spfa()算法(求最短路)

spfa算法是对bellman_ford算法的优化&#xff0c;大部分求最短路问题都可以用spaf算法来求。 注意&#xff1a; &#xff08;1&#xff09;如若图中有负权回路&#xff0c;不能用spfa算法&#xff0c;要用bellman_ford算法&#xff1b;若只有负权边&#xff0c;则可以用 spf…

得到任务式 大模型应用开发学习方案

根据您提供的文档内容以及您制定的大模型应用开发学习方案&#xff0c;我们可以进一步细化任务式学习的计划方案。以下是具体的任务式学习方案&#xff1a; 任务设计 初级任务 大模型概述&#xff1a;阅读相关资料&#xff0c;总结大模型的概念、发展历程和应用领域。深度学…

vue3响应式工具 toRefs() 和 toRef()

前言 直接解构响应式对象的属性进行赋值给新的变量&#xff0c;会导致新变量失去响应式。 当修改新变量的值时&#xff0c;不会触发原始响应式对象的更新&#xff0c;从而在模板中也不会有相应的视图更新。 示例&#xff1a; <template><div><p>姓名: {{ …

案例分享—国外深色UI界面设计赏析

在国外&#xff0c;深色界面设计&#xff08;Dark Mode&#xff09;已成为提升用户体验的重要趋势。它不仅有效减少屏幕亮度&#xff0c;保护用户视力&#xff0c;还能在夜晚或低光环境下提供更加舒适的浏览体验。设计师们普遍认识到&#xff0c;深色主题不仅提升了应用的视觉层…

android13禁用打开wifi ap 热点

总纲 android13 rom 开发总纲说明 目录 1.前言 2.情况分析 3.代码分析 4.代码修改 5.彩蛋 1.前言 这个文章介绍的是如何禁止用户打开wifi热点,禁止用户安装app后,打开wifi热点。 2.情况分析 android13 应用层打开wifi AP public void setWifiApEnabled(boolean isEn…

qt-17不规则窗体

不规则窗体 知识点shape.hshape.cppmain.cpp运行图 知识点 感觉这个就是在图片背景 贴了白色 shape.h #ifndef SHAPE_H #define SHAPE_H#include <QWidget>class Shape : public QWidget {Q_OBJECTpublic:Shape(QWidget *parent nullptr);~Shape(); protected:void m…

HTML及CSS面试题4

1、BFC 1.1、介绍BFC及其应用 补充——触发BFC的方式&#xff0c;常见的有&#xff1a; 设置浮动overflow设置为&#xff1a;auto、scroll、hiddenpositon设置为&#xff1a;absolute、fixed 介绍&#xff1a; ○ 所谓BFC&#xff0c;指的是&#xff1a;一个独立的布局环境&am…

go-zero中间件的使用

一、自定义中间件 1、在api中在服务中定义一个中间件,名字随便取 type PostDemoReq {Name string json:"name" validate:"required" // 姓名Age int64 json:"age" validate:"required,gte1,lte130" // 年龄// optional 表示可选,omi…

漏洞挖掘 | 某系统webpack接口泄露引发的一系列漏洞

信息搜集 这里找到从小穿一条裤子长大的兄弟&#xff0c;要挟他交出来他的统一账号&#xff0c;否则把小时候的照片挂网上&#xff0c;开始某大学的资产搜集&#xff0c;直接hunter搜索此大学域名 看有价值的站点&#xff0c;ok找到下面的站点 未授权敏感信息泄露越权任意用…

docker compose部署rabbitmq集群,并使用haproxy负载均衡

一、创建rabbitmq的data目录 mkdir data mkdir data/rabbit1 mkdir data/rabbit2 mkdir data/rabbit3 二、创建.erlang.cookie文件&#xff08;集群cookie用&#xff09; echo "secretcookie" > .erlang.cookie 三、创建haproxy.cfg配置文件 global log stdout fo…

018集——递归函数和for循环对比(从1加到100实例) ——C#学习笔记

本例分别用递归函数和for循环&#xff0c;求出1到100的和&#xff1a; using System;namespace Mytest {class Mytest{static void Main(string[] args){Calculate Myc new Calculate();int YourNumber 100;int Mysum Myc.Xto1(YourNumber);Console.WriteLine("从1加到…

Go-Zero微服务框架下开发接口流程

目录 一&#xff1a;定义api入参和返回值 二&#xff1a;生成入参和返回值文件 三&#xff1a;定义rpc参数和返回值 四&#xff1a;生成返回值和参数 五&#xff1a;定义数据库 六&#xff1a;生成数据库文件 今天我们来讲解下如何在Go-Zero下开发一个api接口的具体流程&…

Android 13 GMS 内置壁纸

如图&#xff0c;原生系统上&#xff0c;设备上的壁纸 显示系统内置壁纸。如果没有添加内置壁纸&#xff0c;就显示默认的壁纸。点击进去就是预览页面 扩展下&#xff0c;默认壁纸在 frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png frameworks/b…

Markdown导出为 Excel文件 Vue3

直接复制到单文件内即可使用 需要用到的插件 xlsx 0.17.5marked 14.0.0file-saver 2.0.5vue 3.4.29 直接SFC单文件内使用 <script setup> import {reactive} from vue; import xlsx from xlsx; import {marked} from marked; import {saveAs} from file-saver;const…

博达网站群管理平台 v6.0使用相关问题解决

1 介绍 最近受人所托&#xff0c;需要用博达网站群管理平台创建一个网站。该平台的内部版本为9.8.2。作为一个能直接从代码创建网站系统的人&#xff0c;初次使用本平台&#xff0c;刚开始感觉摸不着头脑。因为该平台存在的目的&#xff0c;就是让不懂代码的人能快速创建网站&…