问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Vue中利用全局事件总线实现组件之间通信

发布网友 发布时间:2024-09-17 06:07

我来回答

1个回答

热心网友 时间:2024-10-11 11:27

前言

前一篇文章写了vue中利用Props实现组件之间的通信,那种方式是最简单也是最基础的组件之间的通信方式。父组件通过props向下传数据给子组件,当子组件有事情告诉父组件时会通过$emit事件告诉父组件。对于父子组件,这种传递方式,是较为方便且实用的,但是对于祖孙组件或者兄弟组件,就显得不那么友善了。

在Vue本身的生态中,也有一个独立的Vuex库用来处理组件之间的通讯,但很多时候,咱们并不需要动用类似Vuex这种大杀招,而可以考虑更简单的Vue中的事件总线,即EventBus。

在这提出一个简单的思考:

一旦当你看到项目中,某段代码或者是要点很多下才能出来的变量,再或者获取到的方式都相同,这个时候你就一定要考虑能不能让代码达到复用,咱们要学会偷懒哈,偷懒才能前进的更快哈.

下面开始今天的正文哈...

一、什么叫全局事件总线1.1、概念的引入

我们先认清一件事情,所谓的组件之间的交互,就是我们将数据能够做到组件之间能够共享数据。

无论是props、EventBus、Vuex、发布订阅等实现组件交互,本质就是做到数据共享。弄清这一点,对于使用全局事件总线,就简单多了哈。不过今天的文章,主要是先带着大家使用,原理等周末拉。

EventBus又称为事件总线。在Vue中可以使用EventBus来作为沟通桥梁的概念,就像是所有组件共用相同的事件中心,可以向该中心注册发送事件或接收事件,所以组件都可以上下平行地通知其他组件,但也就是太方便所以若使用不慎,就会造成难以维护的灾难,因此才需要更完善的Vuex作为状态管理中心,将通知的概念上升到共享状态层次。

1.2、安装全局事件总线//想要成为事件总线的条件://1、所有的组件对象必须都能看得到这个总线对象,因此我们把这个对象放在了Vue原型//2、这个事件总线对象必须能调用$on和$emit方法(总线对象必须是Vue的实例化对象或者是组件对象)

确定全局事件总线:将vm对象作为事件总线挂载到vue的原型对象上

importVuefrom'vue'importAppfrom'./App.vue'Vue.config.proctionTip=false//关于全局总线的使用说明//使用全局总线的时候,更好的应用是在兄弟组件、祖孙组件之间,这些组件他们并不能做到直接通信,这个使用全局事件总线会方便很多newVue({render:h=>h(App),//beforeCreate位于数据挂载之前的生命周期函数beforeCreate(){//安装全局事件总线Vue.prototype.$bus=this}}).$mount('#app')1.3、基本使用

小案例:

在App组件内引入一个demo组件,demo组件中有一个按钮,点击可以修改app组件传给子组件的值,并更新视图。

App组件

<template><divclass="todo-container">//数据的传递,还是用props快哈<Demo:msg="msg"></Demo></div></template><script>importDemofrom'./components/Demo'exportdefault{components:{Demo},data(){return{msg:'hello,你好'}},methods:{updateMsg(){this.msg='hello,你好丫,我是博主宁在春'},updateMsg2(value){this.msg=value}},//在加载完成后就进行全局总线的绑定mounted(){//绑定方法,'updateMsg'是全局事件总线方法名,而后面是回调时需要执行的方法this.$bus.$on('updateMsg',this.updateMsg)this.$bus.$on('updateMsg2',this.updateMsg2)},//养成习惯在组件销毁的时候,将事件进行解绑beforeDestroy(){//就是解绑事件,有多种方式,参数为空,直接是让所有方法解绑//多个的时候,可以直接放一个数组进去。//this.$bus.$off(['updateMsg',....])this.$bus.$off('updateMsg')this.$bus.$off('updateMsg2')//原理就让我留到下次吧,兄弟们}}</script>

demo组件

<template><div><h1>{{msg}}</h1><button@click="updateMessage()">点击修改</button><button@click="updateMessage2('你好丫,宁在春')">点击修改</button></div></template><script>exportdefault{props:{msg:String},methods:{updateMessage(){//通过全局事件总线来进行交互,//第一个参数是要回调父组件中的方法名,后面可以跟参数,多个或者对象都可以this.$bus.$emit('updateMsg')},updateMessage2(value){this.$bus.$emit('updateMsg2',value)}}}</script>

二、全局事件总线和Props实现组件通信的区别

个人使用总结的哈:

props用来实现组件之间通信,更多的方便于父子组件通信。如果是祖孙或者兄弟组件,将会多一层中间层,而且没有任何用处,而且给人的感觉比较繁琐。

全局事件总线的话,将它挂在vm原型上,对于祖孙组件、或者兄弟组件之间通信,非常的方便,不需要中间层,非常的方便。

后语

大家一起加油!!!如若文章中有不足之处,请大家及时指出,在此郑重感谢。

纸上得来终觉浅,绝知此事要躬行。

大家好,我是博主宁在春

一名喜欢文艺却踏上编程这条道路的小青年。

希望:我们,待别日相见时,都已有所成。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么药止痒效果好 慕容三藏履历 职业cf电脑配置cf电脑配置要求是什么 玩3a电脑配置要求想玩3a大作需要什么配置 台式电脑哪些可以畅享3a大作想玩3a大作需要什么配置 七彩虹i7-10700台式机 性能强劲 高效静音 小黄鱼游戏台式电脑主机(i7-10700F、16GB、512GB、RTX3070)-适用... 工伤保险记什么科目 在4×4的正方形格纸中,有一个以格点为顶点的△ABC,请你找到点C,使三角... 在4×4方格中, 要求C点在格点上,且以AB为边的△ABC为直角三角形,标出所... 名片设计软件有哪些 哪个软件可以做名片 丙苯酚俗称是什么 狗被别人打死了 没有录像 狗被别人打死了可以报警吗 怎样才能开一个贴吧 怎么开百度的贴吧? 怎么在百度上开通属于我自己的贴吧? Nature Communications | 中国科学院植物研究所揭示泥炭藓湿地中独特的... 找工人拆旧床包红包吗 八字身强无印好吗,八字身强的条件是什么 绅士一流是什么意思 绅士是什么意思 解释 如何备份通讯录到微信公众号? 微信自己关注的公众号 可以导出备份吗 如何修改BIOS初始时间 VC++编译出错 No such file or directory 跟我学改BIOS之一:BIOS里面都有什么? 出堂以后九月九有什么要做的 农历三月三出生的说法 vue2.0组件之间通信(父子、子父、平级) Vue3.2+Ts组件之间通信 xp怎么设置定时关机xp设置定时关机方法 XP系统。定时关机,我想明天早上06:00关闭计算机。如何设 新生儿化脓性脑膜炎护理 18三体综合症知多少 家庭暴力的5个解决方法 大家觉得哪顶帽子和本体更配?很纠结 有二对父子到商场买帽子为什么只买三顶帽子 奔驰c200二手价格 婴儿游泳水温是多少 婴儿游泳的最佳水温以及准备 香港旺角小龙女街头演唱经典老歌,行人听到都不愿离开! 南京晓庄附近是不是有个墓园 叫什么名字? 坐多少路的公交可以到那里... 南京瑞华大酒店酒店信息 欧乐堡五一人多吗_江苏用电的峰谷时段是怎样划分 2023年5月5号出生钟姓宝宝取名叫什么 2024年8月9号出生钟姓宝宝取名叫什么 2023年2月3号出生钟姓宝宝取名叫什么 2023年2月19号出生钟姓宝宝取名叫什么