vue3 中简单实现 vue2的bus总线
项目背景:vue3
众所周知在重构的vue3后,vue2的bus总线通信就随之无法使用。
bus总线有点像 Vuex 或者 Pinia ,可以使用发布订阅模式来简单实现下。
不是很了解的同学可以 ♥ 观察者模式浅尝♥
♥ 发布订阅模式浅尝♥
原理分析:
- 参照发布订阅模式 需要一个list来存放相应的事件
- $on 方法用来注册事件。
- $emit 方法可以调用 $on 里的事件。
- $off 方法可以注销 eventList 里的事件。
----上代码实现-----
class Bus { constructor(){ list:{},//收集存放事件,相当于收集订阅信息,调度中心 } //订阅 $on(name,fn){ this.list[name]=this.list[name] || [] this.eventList[name].push(fn) } //发布 $emit(name,data){ //判断是否订阅 if(this.list[name]){ this.list[name].forEach((fn)=>{ fn(data) }) } } //取消 $off(name){ if (this.eventList[name]) { delete this.eventList[name] } } } //导出Bus的实例 export default new Bus()
也可以像Vuex 或者 Pinia一样,在原型constructor上定义一些私有属性或公共数据
要使用的组件导入对应的bus.js,就能操作一份数据方法
bus的使用
跟 vue2的bus总线使用形式差不多
1.在父组件中
<script setup> import Busbox from "./component/bus.vue";//子组件 import Bus from "../../config/Bus";//相应的 bus.js import { onMounted, onUnmounted, ref } from "vue"; let busInfo = ref(""); //监听change Bus.$on("change", (res) => { console.log("子组件传递参数", res); busInfo.value = res; }); //在组件注销的时候取消相应订阅 onUnmounted(() => { Bus.$off("change"); }); </script>
2.在子组件中
<script setup> import Bus from "../../../config/Bus.js";//相应的 bus.js function clickPar(){ //往change发布任务 Bus.$emit('change','子组件点击了按钮') } </script>
有点类似于 mitt插件的用法,都是借鉴发布订阅模式,参考vue2的EventBus总线
mitt使用
先安装 npm i mitt -S
然后像以前封装 bus 一样,封装一下
mitt.js import mitt from 'mitt' const mitt = mitt() export default mitt
后续是使用参考上面使用就行。
如果对发布订阅模式不是很清楚的
https://www.cnblogs.com/zjxlicheng/p/16469913.html
https://www.cnblogs.com/zjxlicheng/p/16517326.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通