vue兄弟组件通信问题:$emit和$on-阿里云开发者社区

开发者社区> gsben> 正文

vue兄弟组件通信问题:$emit和$on

简介: vue兄弟组件通信:$emit和$on
+关注继续查看

timg

在前端,不管我们做什么样的业务和功能,都不会离开页面之间的通信问题,在pc端是这样,在移动端更需要解决页面之间的通信问题。
今天我们来看看Vue的通信方法一----事件总线。在简单的场景下,可以使用一个空的 Vue 实例作为事件总线,具体的官方文档可看非父子组件通信 。官方文档很简洁,但是像我这种菜鸟看的是一脸懵逼,官方的例子也没有(估计是认为太简单了🤣),最后自己慢慢摸索,实践,感觉事件总线还是挺好用的。
首先看一下基本的目录结构:

image

首先声明一下,components下面的三个组件互相之间并没有什么关系,强调一下没有任何关系,不要把他们当成兄弟组件关系,仅仅是放到同一个目录下而已。事件总线实际就是一个new出来的空的vue实例,就是目录中的 eventBus.js ,其内容是

image

不懂的就把他看成是中介公司,通过它达到你和用人单位之间的合作(通信),然后在每个组件引用它就🆗了。
先来看一下我们的donghua组件内容,直接上图

image

v-show是用来控制显示或隐藏的,其实它控制的是display,vue的特点之一就是组件化,即可重用,可以被别的组件嵌套(即组件套组件的方式)。但是想要随时使用某个组件时,以上红箭头的三步是必备的步骤,缺一不可,即第一步导入组件的资源文件import xx,第二步,在components中注册导入的组件,最后将注册的组件当自定义的标签一样在模板中使用,注意一定得放到thirdchild这个div的里面,不能与其同级,因为一个模板有且仅有一个根节点,并且自定义的标签名要与注册的组件名一样,其实在components注册的组件是简化了的,实际是

image

当导入的组件名和标签名一样时可以简写(即只写一个),当然标签名<firtst></first>也是可以改的,但是得要与components中键值对中的key(健名)相同即可,实际上key就是我们自定义的名字(标签名),健值就是组件名。
fisrtchild组件的内容为

image

为了显眼点,我给donghua组件的边框为红色,firstchild组件的边框为蓝色,现在donghua组件的现象是

image

现在我们给donghua组件一个点击事件并把消息“hello guo”带到firstchild组件并显示出来

image
运用bus的前提是你已经引进来了这个文件

image

然后我们在firstchild那边接收并显示

image

注意$emit和$on发送和接收的事件名必须一致,本次事件名是event,然后回调函数对接收的数据进行处理(可以直接操作data里面的数据),还要注意下this对象,即上下文的内容(黄色的框),我们来看一下结果

image

“hello guo”就出现了,但这不是兄弟组件的传值,donghuafirstchild属于父子组件,因为firstchild是以标签的形式嵌入donghua组件中的,我们再来写一个second组件,边框为绿色。

image

然后我们再donghua组件中注册它

image

现在firstchildsecond就是兄弟组件的关系了,现在我们来传值,在firstchild组件将“欢迎来到gsben的博客”信息发给second的组件并让其显示出来,firstchild的内容是

image

我们现在再来看看donghua组件

image

当我们点击firstchild组件传值按钮后,

image

会发现,接收值从world变成了我们传的值“欢迎来到gsben的博客”,这样兄弟组件的也成功了。

但是,作为一个小白,这过程肯定会遇到问题的(可能我的领悟能力太差),下面是我曾经遇到的困难,纠结等的总结,想给大家分享一波。

第一:要弄清楚兄弟组件中组件之间的关系,并不是在同一个目录长得都差不多就是兄弟组件关系,只有两个组件在同一div(容器)内,才算是兄弟关系,当然组件可以套子组件,子组件还可以在套子组件,就是可以有多层关系(父子,兄弟,祖孙...),注意组件使用的三部曲。

第二:并不一定得把所有组件都放到app.vue中,app.vue是一个根节点,也是一个单页面内容的展示区。一般只会把公共的部分放到app.vue中,只要放到app.vue中的东西,不管是html标签还是组件,在最开始加载时都会将他们显示出来。所以一般除了公共的内容放到app.vue中,其他的都会放到组件中,然后在配置路由,让一加载,就自动到指定的路由所对应的组件上,如上面的例子

image

你也可以让加载后只显示一个组件,而不是三个组件,让人感觉就像是页面跳转了一样,换了一个页面似的。我上面用的是v-show 你也可以用绑定类class的方法来控制。

第三:深刻理解单页面。vue的整个应用其实就是一个页面,只是配置了不同是路由,然后跳转到不同的组件,有的甚至不需要配置路由,直接将很多内容或者组件放在一个div中,然后控制他们的显示或是隐藏就可以了,点击一下,就换一个页面,看起来是跳转了页面(实际上只是改变了下组件的隐藏而已,其实你也可以看到它跳转的时候或是更换页面的时候,其实url并没有改变)。

我记得官方文档说过,你的页面不是很多,业务逻辑也不是很复杂时,事件总线是一个很好的解决页面通信的方法,其不仅在于兄弟组件能通信,也可跨组件通信,本次实践内容就是这样。最后一句,实践是检验真理的唯一标准!

以上就是本章的内容,有点啰嗦,但是是我做兄弟组件通信时的“心里路程”,欢迎吐槽,本节代码事件总线。最近在看vue作者力荐的一本书Vue.js实战,很nice,里面讲得非常详细,感兴趣的小伙伴可以看看。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
vue兄弟组件通信(非vuex)
实例:点击按钮将组件A的"A数据"传到组件B的方框内 image 实现思路:根据官方文档的教程->使用一个空的 Vue 实例作为事件总线 官方文档 代码展示 组件通讯 .
696 0
vue_music:封装scroll.vue组件
在项目中经常用到滚动,结合Better-scroll封装了sroll.vue组件参考链接:https://ustbhuangyi.github.io...http://www.imooc.com/article/...**better-scroll 只处理容器(wrapper)的第一个子元素(content)的滚动,其它的元素都会被忽略**。
1101 0
通用社区登陆组件技术分享(开源)中篇:OAuth 登陆组件流程及组件集成方法
原文http://www.cnblogs.com/cyq1162/archive/2012/11/06/2756247.html   上节内容:通用社区登陆组件技术分享(开源)上篇:OAuth 授权登陆介绍   本节包括以下内容: 1:第三方社区账号登陆的授权流程 2:OAuth2 组件的下载及web.
793 0
通用社区登陆组件技术分享(开源)下篇:OAuth 源码下载及原理解说
原文http://www.cnblogs.com/cyq1162/archive/2012/11/07/2756848.html 上节内容: 1:通用社区登陆组件技术分享(开源)上篇:OAuth 授权登陆介绍 2:通用社区登陆组件技术分享(开源)中篇:OAuth 登陆组件流程及组件集成方法 ...
877 0
我司小伙伴研发的 vue 组件调试工具开源了!
我司小伙伴研发的 vue 组件调试工具 VCI(vue component inspector),现在开源了,欢迎关注 star !
132 0
VUE实现一个分页组件
分页是WEB开发中很常用的功能,尤其是在各种前后端分离的今天,后端API返回数据,前端根据数据的count以及当前页码pageIndex来计算分页页码并渲染到页面上已经是一个很普通很常见的功能了。从最开始的jquery时代到现在的各种各样的前端框架时代,分页功能都是必不可少的。
1461 0
vue 组件间传值
1、父组件给子组件传值 父组件: &lt;template&gt; &lt;child :name="name"&gt;&lt;/child&gt; &lt;/template&gt; &lt;script&gt; import child from ".
678 0
+关注
gsben
on the way .....
9
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载