当前位置: 首页 > article >正文

Vue 全局事件总线:Vue 2 vs Vue 3 实现

🌟 前言

欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍

  • 🤖 洛可可白:个人主页

  • 🔥 个人专栏:✅前端技术 ✅后端技术

  • 🏠 个人博客:洛可可白博客

  • 🐱 代码获取:bestwishes0203

  • 📷 封面壁纸:洛可可白wallpaper

在这里插入图片描述

这里写自定义目录标题

  • Vue 全局事件总线:Vue 2 vs Vue 3 实现
    • 引言
    • Vue 2 全局事件总线
      • 实现步骤
    • Vue 3 全局事件总线
      • 实现步骤
    • 比较与结论
      • Vue 2 事件总线
      • Vue 3 事件总线

Vue 全局事件总线:Vue 2 vs Vue 3 实现

引言

在构建大型Vue应用时,跨组件通信是一个常见需求。Vue提供了多种通信方式,包括父子组件传参、兄弟组件通信、Vuex状态管理等。然而,对于简单的跨组件通信,全局事件总线(Event Bus)提供了一种轻量级的解决方案。本文将比较在Vue 2和Vue 3中实现全局事件总线的方法,并探讨各自的优缺点。

Vue 2 全局事件总线

在Vue 2中,全局事件总线通常通过创建一个新的Vue实例来实现,这个实例作为中央枢纽供所有组件使用。

实现步骤

  1. 创建事件总线
// event-bus.js
import Vue from 'vue';
export const EventBus = new Vue();
  1. 在组件中使用事件总线
<template>
  <button @click="emitEvent">发射事件</button>
</template>

<script>
import { EventBus } from './event-bus.js';

export default {
  methods: {
    emitEvent() {
      EventBus.$emit('my-event', '这是来自组件A的消息');
    }
  }
}
</script>
<template>
  <div>
    <h2>事件消息:{{ message }}</h2>
  </div>
</template>

<script>
import { EventBus } from './event-bus.js';

export default {
  data() {
    return {
      message: ''
    };
  },
  created() {
    EventBus.$on('my-event', this.handleEvent);
  },
  methods: {
    handleEvent(msg) {
      this.message = msg;
    }
  },
  beforeDestroy() {
    EventBus.$off('my-event', this.handleEvent);
  }
}
</script>

Vue 3 全局事件总线

Vue 3引入了组合式API,提供了更多灵活性。我们可以利用这些新特性来实现全局事件总线。

实现步骤

  1. 创建事件总线
// event-bus.js
import { reactive, readonly } from 'vue';

const state = reactive(new Map());

function emit(event, payload) {
  (state.get(event) || []).forEach((callback) => callback(payload));
}

function on(event, callback) {
  if (!state.has(event)) {
    state.set(event, []);
  }
  state.get(event).push(callback);
  return () => off(event, callback);
}

function off(event, callback) {
  const callbacks = state.get(event);
  if (callbacks) {
    callbacks.splice(callbacks.indexOf(callback), 1);
  }
}

export const EventBus = {
  emit,
  on,
  off,
  readonly: readonly(state),
};
  1. 在组件中使用事件总线
<template>
  <button @click="emitEvent">发射事件</button>
</template>

<script setup>
import { EventBus } from './event-bus.js';

const emitEvent = () => {
  EventBus.emit('my-event', '这是来自组件A的消息');
};
</script>
<template>
  <div>
    <h2>事件消息:{{ message }}</h2>
  </div>
</template>

<script setup>
import { ref, onUnmounted } from 'vue';
import { EventBus } from './event-bus.js';

const message = ref('');

const listener = (msg) => {
  message.value = msg;
};

EventBus.on('my-event', listener);

onUnmounted(() => {
  EventBus.off('my-event', listener);
});
</script>

比较与结论

Vue 2 事件总线

  • 优点:简单易用,不需要额外的库或工具。
  • 缺点:随着应用规模的增长,事件总线可能会变得难以维护,且不易于跟踪事件的来源和去向。

Vue 3 事件总线

  • 优点:利用组合式API,代码更加模块化,易于维护。响应式的状态管理使得事件监听和发射更加灵活。
  • 缺点:需要对组合式API有一定的了解,对于初学者来说可能有一定的学习曲线。

如果对你有帮助,点赞👍、收藏💖、关注🔔是我更新的动力!👋🌟🚀


http://www.kler.cn/a/464462.html

相关文章:

  • 瑞芯微rk3568平台 openwrt系统适配ffmpeg硬件解码(rkmpp)
  • GitHub Fork 和 Clone 的深度指南:操作解析与 Pull Request 完整流程20241231
  • 数据结构考前一天
  • Vue项目中生成node_modules文件夹的两种常用方法及npm优势
  • typescript安装后仍然不能使用tsc,如何解决
  • Qemu配置QXL显卡支持分辨率
  • 一条SQL语句是如何执行的
  • BOC调制信号matlab性能仿真分析,对比功率谱,自相关性以及抗干扰性
  • python学opencv|读取图像(二十三)使用cv2.putText()绘制文字
  • 嵌入式驱动开发详解8(阻塞/非阻塞/异步通信)
  • Dokcer部署双主Mysql
  • XDOJ 771 求二叉树高度
  • C++ 面向对象编程:多继承、多态
  • 人工智能安全与隐私——联邦遗忘学习(Federated Unlearning)
  • 利用Java爬虫获取店铺所有商品:技术实践与应用指南
  • Windows通过X11转发显示远程Linux上的图形界面
  • 问题记录:[FATAL] [1735822984.951119148]: Group ‘manipulator‘ was not found.
  • vLLM结构化输出(Guided Decoding)
  • C语言中的va_list
  • 云架构Web端的工业MES系统设计之区分工业过程
  • 工业路由器是什么?ER5000为何是领先5G路由器行业
  • 鸿蒙HarmonyOS开发:系统服务(拨打电话、网络搜索、联系人、位置服务、拉起弹框请求用户授权)
  • OpenCV报错:应用程序无法正常启动0xc000007b
  • Hack The Box-Starting Point系列Responder
  • CSS列表、表格、鼠标、滤镜样式设置
  • 深入理解 C 语言预处理:从源文件到可执行程序的关键步骤