Vue2.0组件之间通信

作者: PengL | 来源:发表于2017-01-18 12:12 被阅读12315次

Vue中组件这个特性让不少前端er非常喜欢,我自己也是其中之一,它让前端的组件式开发更加合理和简单。笔者之前有写过一篇Vue2.0子父组件通信,这次我们就来聊一聊平级组件之间的通信。


首先我们先搭好开发环境,我们先得装好git和npm这两个工具(如果有不清楚的同学请自行百度哦)

环境搭建步骤:

  • 打开git ,运行 npm install --global vue-cli 这是安装vue的命令行
  • vue init webpack vue-demo 这是vue基于webpack的模板项目
  • cd vue-demo 进入vue-demo文件夹
  • npm install 安装package.json中依赖的node_modules
  • npm run dev 运行该项目

Vue2.0子父组件通信这篇文章聊到过无论是父向子传值还是子向父传值,都需要一个中间介质。对于平级组件来说其实也一样,他们也需要一个中间介质来作为一个中央事件总线,我们了解到这个之后就开始来写个Demo吧。

我们在git上运行 npm run dev 的命令后,浏览器中会打开一个vue基于webpack构建工具的一个模板项目,接着我们在编辑器中进入Demo,我们可以删除掉模板项目中src/components/Hello.vue,然后在App.vue中删除对于Hello子组件的注册和使用还有一些其他无关紧要的东西,此时的App.vue应为这样

App.png
一 .我们先来创建中央事件总线,在src/assets/下创建一个eventBus.js,内容如下
eventBus.png

eventBus中我们只创建了一个新的Vue实例,以后它就承担起了组件之间通信的桥梁了,也就是中央事件总线。

二 . 创建一个firstChild组件,引入eventBus这个事件总线,接着添加一个按钮并绑定一个点击事件
firstChild.png

我们在响应点击事件的sendMsg函数中用$emit触发了一个自定义的userDefinedEvent事件,并传递了一个字符串参数
PS:$emit实例方法触发当前实例(这里的当前实例就是bus)上的事件,附加参数都会传给监听器回调。

三 . 我们再创建一个secondChild组件,引入eventBus事件总线,并用一个p标签来显示传递过来的值
secondChild.png

我们在mounted中,监听了userDefinedEvent,并把传递过来的字符串参数传递给了$on监听器的回调函数
PS:
mounted:是一个Vue生命周期中的钩子函数,简单点说就类似于jquery的ready,Vue会在文档加载完毕后调用mounted函数。
$on:监听当前实例上的自定义事件(此处当前实例为bus)。事件可以由$emit触发,回调函数会接收所有传入事件触发函数($emit)的额外参数。

四 . 在父组件中,注册这两个组件,并添加这两个组件的标签
App2.png
保存所有修改的文件,然后打开浏览器窗口,内容如下(css请自行处理)
browser.png
点击向组件传值按钮,我们可以看到传值成功
browser2.png
总结:
  • 创建一个事件总线,例如demo中的eventBus,用它作为通信桥梁
  • 在需要传值的组件中用bus.$emit触发一个自定义事件,并传递参数
  • 在需要接收数据的组件中用bus.$on监听自定义事件,并在回调函数中处理传递过来的参数

** 题外话:**
1.看过笔者上一篇Vue2.0子父组件通信这篇文章的同学可以感觉到,组件之前的通信其实和子组件向父组件传值有些类似,其实他们的通信原理都是相同的,例如子向父传值也是$emit和$on的形式,只是没有eventBus,但若我们仔细想想,此时父组件其实就充当了bus这个事件总线的角色。
2.这种用一个Vue实例来作为中央事件总线来管理组件通信的方法只适用于通信需求简单一点的项目,对于更复杂的情况,Vue也有提供更复杂的状态管理模式Vuex来进行处理

相关文章

  • Vue 父子组件通信

    子组件与父组件通信 1、通过$emit实现通信 vue2.0只允许单向数据传递,我们通过出发事件来改变组件的数据,...

  • React的组件通信

    组件之间进行通信的情况: 父组件向子组件通信 子组件向父组件通信 兄弟组件之间通信 发布者-订阅者模式 一、父组件...

  • vue组件间通信

    vue组件间通信 1.父组件向子组件传递数据--props 在vue2.0中使用props实现向子组件传递数据: ...

  • 老生常谈——vue组件之间通信

    老生常谈的组件之间通信 vue组件之间的通信细分为三种情况:兄弟组件之间的通信,父组件向子组件传递数据,子组件向父...

  • [Vue]组件之间如何通信?

    组件通信可以大致分为两种情况,父子组件之间的通信和非父子组件之间的通信,下面来分别介绍 一、父子组件之间的通信 1...

  • vue2.0 同级组件之间的通信

    下面做的小demo是点击组件的时候 将A组件里面的数据{a:'我是A组件'} 传...

  • Vue2.0组件之间通信

    1.父组件传递数据给子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现父组件: 子组件通过prop...

  • Vue2.0组件之间通信

    Vue中组件这个特性让不少前端er非常喜欢,我自己也是其中之一,它让前端的组件式开发更加合理和简单。笔者之前有写过...

  • Vue.js--组件通信

    vue组件之间的通信包括三种: 1.父组件向子组件通信 2.子组件向父组件通信 3.同级组件之间的通信 首先,看一...

  • react之组件通信

    需要组件之进行通信的几种情况: 父组件向子组件通信 子组件向父组件通信 跨级组件通信 没有嵌套关系组件之间的通信 ...

网友评论

  • Web的美容师:请问 你这写的什么啊
  • 城北梦还:secondChild这个在哪个文件夹里创建
  • 前端西瓜哥:记得是 import Vue from 'vue‘ 。而不是 'Vue'。 我搞了半天才发现这个。。
  • KindredV:bus.$on 注册事件了,严谨点还要在destoryed时,移除事件bus.$off
  • 前端课堂:清晰明了
  • 辛锐:请问router-view的两个组件之间如何通信呢
    PengL:@agrass 使用Vuex就可以了
    agrass:请问有解决方法吗
    agrass:我也遇到这个问题。
  • MySunshine_dd6a:请问这种通信传送的数据有多大的限制呢...
    MySunshine_dd6a:@PengL 谢了
    PengL:@MySunshine_dd6a 我无法给出一个具体数字,不过这样的通信一般都是小数据通信。其次这个通信只是vuex的实现原理,复杂通信肯定用vuex
  • 芸芸人海之中独独遇见你:请问如果是两个页面的两个组件应该如何传值呢
    page1点击路由跳转 --> page2
    芸芸人海之中独独遇见你:@卿_4325 嗯= =,口误。我用vuex了,不用vuex的话要page1-->父组件-->page2
    43ea12f01d32:既然是路由了 哪还有两个页面
  • e6c9ec732983:谢谢老哥的分享,

本文标题:Vue2.0组件之间通信

本文链接:https://www.haomeiwen.com/subject/rssvbttx.html