🌟 前言
欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍
🤖 洛可可白:个人主页
🔥 个人专栏:✅前端技术 ✅后端技术
🏠 个人博客:洛可可白博客
🐱 代码获取: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实例来实现,这个实例作为中央枢纽供所有组件使用。
实现步骤
- 创建事件总线
// event-bus.js
import Vue from 'vue';
export const EventBus = new Vue();
- 在组件中使用事件总线
<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,提供了更多灵活性。我们可以利用这些新特性来实现全局事件总线。
实现步骤
- 创建事件总线
// 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),
};
- 在组件中使用事件总线
<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有一定的了解,对于初学者来说可能有一定的学习曲线。
如果对你有帮助,点赞👍、收藏💖、关注🔔是我更新的动力!👋🌟🚀