有时候两个组件也需要通信(非父子关系)。当然Vue2.0提供了Vuex,但在简单的场景下,可以使用一个空的Vue实例作为中央事件总线。

参考:http://blog.csdn.net/u013034014/article/details/54574989?locationNum=2&fps=1

例子:https://segmentfault.com/q/1010000007491994

  1. <div id="app">
  2. <c1></c1>
  3. <c2></c2>
  4. </div>
 
  1. var Bus = new Vue(); //为了方便将Bus(空vue)定义在一个组件中,在实际的运用中一般会新建一Bus.js
  2. Vue.component('c1',{ //这里已全局组件为例,同样,单文件组件和局部组件也同样适用
  3. template:'<div>{{msg}}</div>',
  4. data: () => ({
  5. msg: 'Hello World!'
  6. }),
  7. created() {
  8. Bus.$on('setMsg', content => {
  9. this.msg = content;
  10. });
  11. }
  12. });
  13. Vue.component('c2',{
  14. template: '<button @click="sendEvent">Say Hi</button>',
  15. methods: {
  16. sendEvent() {
  17. Bus.$emit('setMsg', 'Hi Vue!');
  18. }
  19. }
  20. });
  21. var app= new Vue({
  22. el:'#app'
  23. })

在实际运用中,一般将Bus抽离出来:

Bus.js

  1. import Vue from 'vue'
  2. const Bus = new Vue()
  3. export default Bus

组件调用时先引入

组件1

  1. import Bus from './Bus'
  2.  
  3. export default {
  4. data() {
  5. return {
  6. .........
  7. }
  8. },
  9. methods: {
  10. ....
  11. Bus.$emit('log', 120)
  12. },
  13.  
  14. }

组件2

  1. import Bus from './Bus'
  2.  
  3. export default {
  4. data() {
  5. return {
  6. .........
  7. }
  8. },
  9. mounted () {
  10. Bus.$on('log', content => {
  11. console.log(content)
  12. });
  13. }
  14. }

但这种引入方式,经过webpack打包后可能会出现Bus局部作用域的情况,即引用的是两个不同的Bus,导致不能正常通信

运用二:

当然也可以直接将Bus注入到Vue根对象中,

  1. import Vue from 'vue'
  2. const Bus = new Vue()
  3.  
  4. var app= new Vue({
  5. el:'#app',
  6.    data:{
  7.     Bus
  8. }  
  9.  
  10. })

在子组件中通过this.$root.Bus.$on(),this.$root.Bus.$emit()来调用

运用三:

将bus挂载到vue.prototype上(这里用了插件的写法)

  1. // plugin/index.js
  2. import Bus from 'vue';
  3. let install = function (Vue) {
  4. ... ...
  5. // 设置eventBus
  6. Vue.prototype.bus = new Bus();
  7. ... ...
  8. }
  9.  
  10. export default {install};
  11.  
  12. // main.js
  13. import Vue from 'vue';
  14. import plugin from './plugin/index';
  15. ... ...
  16.  
  17. Vue.use(plugin);
  18.  
  19. ... ...

组件一中定义

  1. ... ...
  2. created () {
  3. this.bus.$on('updateData', this.getdata);
  4. }

组件二中调用

  1. this.bus.$emit('updateData', {loading: false});

注意:注册的总线事件要在组件销毁时卸载,否则会多次挂载,造成触发一次但多个响应的情况

  1. beforeDestroy () {
  2. this.bus.$off('updateData', this.getData);
  3. }

vue Bus总线的更多相关文章

  1. vue组件中—bus总线事件回调函数多次执行的问题

    在利用vue组件进行事件监听时发现,如果对N个vue组件实例的bus总线绑定同一事件的回调函数,触发任意组件的对应事件,回调函数至少会被执行N次,这是为什么呢? 为此,调研了普通对象的事件绑定和触发实 ...

  2. vue bus 的使用

    简单的状态管理,可以用vue bus vue bus可以实现不同组件间.不同页面间的通信,比如我在A页面出发点击事件,要B页面发生变化,使用方法如下: 全局定义:main.js window.even ...

  3. vue bus 中央事件总线

    1.全局定义bus 新建src/eventBus.js 文件 import Vue from 'vue' export default new Vue() //  全局引入mai.jsvue中央事件总 ...

  4. Vue bus的使用(兄弟|非父子组件传值)-->可以使用一个空的Vue实例作为中央事件总线new Vue()

    1.在main.js中注册全局的bus  Vue.prototype.bus=new Vue(); 2.在组建中使用 子组建使用:this.bus.$emit('自定义事件名',data) metho ...

  5. Vue中兄弟组件间传值-(Bus/总线/发布订阅模式/观察者)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. vue 非父子组件之间的传值(Bus/总线/发布订阅模式/观察者模式)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. vue 事件总线(bus)

    1.全局引入bus Vue.prototype.$bus = new.Vue() 2.组件间传值使用(在发送事件时接收组件会实时接收到, 可以用做兄弟组件间相互传值, 但页面跳转组件间有问题 通过$e ...

  8. Vue事件总线(eventBus)$on()会多次触发解决办法

    项目中使用了事件总线eventBus来进行两个组件间的通信, 使用方法是是建立eventBus.js文件,暴露一个空的Vue实例,如下: import Vue from 'vue'export def ...

  9. vue bus的使用

    vue中的bus事件,一般作为中央事件总线来使用 简单例子:比如在A,B组件为兄弟组件,现在A要调用B的中C事件 1.创建一个bus.js 内容: import Vue from 'vue' cons ...

随机推荐

  1. 2018 Multi-University Training Contest 1 杭电多校第一场

    抱着可能杭电的多校1比牛客的多校1更恐怖的想法 看到三道签到题 幸福的都快哭出来了好吗 1001  Maximum Multiple(hdoj 6298) 链接:http://acm.hdu.edu. ...

  2. Matplotlib(used in paper)

    1. 转自:matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域 注:如果不采用 subplot_adjust + margin(0,0),而是在fig.savefig( ...

  3. 代码学习-Linux内核网卡收包过程(NAPI)【转】

    转自:https://blog.csdn.net/crazycoder8848/article/details/46333761 版权声明:本文没有任何版权限制,任何人可以以任何方式使用本文. htt ...

  4. requests库入门11-重定向和请求历史

    默认情况下,除了head请求,requests会自动处理重定向 重定向就是会把url重新指定到另一个.比如github,使用http会自动重定向到https.一些公司也会使用网关啥的做重定向. r = ...

  5. Python3学习笔记03-基础数据类型

    Python 中的变量不需要声明.每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对 ...

  6. JavaScript拼接html字符串时截断问题

    在项目中碰到一个问题,就是JavaScript拼接html标签时,里面特殊字符会有些问题,比如单引号截断配对,导致后面的内容不显示或显示错误.在此记录一下. 下面贴一段简化的代码,若有描述不清的地方还 ...

  7. SharePoint 2013 错误 0x800700DF 文件大小超出允许的限制,无法保存

    问题描述: 利用资源管理员往SharePoint 2013文档库里复制文件时,报错了. 错误 0x800700DF︰ 文件大小超过了允许的限制,无法保存. 解决方法: 解决方法,可以修改本地电脑注册表 ...

  8. <第一站>人生的第一个博客

    在畅畅的疯狂暗示下(“最好”建个博客),我决定在博客园开通我的博客,在此记入我从3月23起的所学所想.在他的提醒之前,我曾经断断续续的在日记本上,手机备忘录里记录过我的学习情况和心路历程,总的来说,自 ...

  9. MySQL新增多个字段

    alter table pic_all add ( `expand1` ), `expand2` ), `expand3` ) );

  10. recv() failed (104: Connection reset by peer) while reading response header from upstream

    2017年12月1日10:18:34 情景描述: 浏览器执行了一会儿, 报500错误 运行环境:  nginx + php-fpm nginx日志:  recv() failed (104: Conn ...