Vue通过eventBut实现组件全局通信

作者:神秘网友 发布时间:2020-10-24 01:02:36

Vue通过eventBut实现组件全局通信

Vue通过eventBut实现组件全局通信

一、组件之间的层级关系如下图:

Vue通过eventBut实现组件全局通信

现要在test_page_1.vue 组件中改变,MyHeader.vue组件中的某个属性值。

二、eventBus简介:

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

EventBus 可以较好的实现兄弟组件之间的数据通讯。

三、使用eventBus解决问题

1、初始化

创建eventbus.js文件

import Vue from 'vue'

// 解决多组件传值问题
export const globalBus = new Vue();

2、在test_page_1.vue 组件中添加发送事件

<script>
import { globalBus } from '../../eventBus';
export default {
  name: 'TestPage1',
  data(){
    return {
        input: ''
    }
  },
  methods: {
      change(){
          globalBus.$emit("change-welcome",this.input);
          console.log(this.input);
      }
  }
}
</script>

3、在MyHeader.vue中添加接收事件

<script> 
import { globalBus } from '../eventBus';

export default {
  name: 'MyHeader',
  data() {}
  },
  methods : {
    ...
  },
  mounted: function(){
    globalBus.$on("change-welcome",welcomeMsg =>{
        this.welcomeMsg = welcomeMsg;
    });
  }
}
</script>

四、eventBus可能会导致的问题

前面提到过,如果使用不善,EventBus会是一种灾难,到底是什么样的“灾难”了?大家都知道vue是单页应用,如果你在某一个页面刷新了之后,与之相关的EventBus会被移除,这样就导致业务走不下去。还要就是如果业务有反复操作的页面,EventBus在监听的时候就会触发很多次,也是一个非常大的隐患。这时候我们就需要好好处理EventBus在项目中的关系。通常会用到,在vue页面销毁时,同时移除EventBus事件监听。

移除eventBus事件监听

import { 
  eventBus 
} from './event-bus.js'
EventBus.$off('aMsg', {})

你也可以使用 EventBus.$off('aMsg') 来移除应用内所有对此某个事件的监听。或者直接调用 EventBus.$off() 来移除所有事件频道,不需要添加任何参数 。

上面就是 EventBus 的使用方法,是不是很简单。上面的示例中我们也看到了,每次使用 EventBus 时都需要在各组件中引入 event-bus.js 。事实上,我们还可以通过别的方式,让事情变得简单一些。那就是创建一个全局的 EventBus 。接下来的示例向大家演示如何在Vue项目中创建一个全局的 EventBus 。

五、介绍全局eventbus的使用

它的工作原理是发布/订阅方法,通常称为 Pub/Sub 。

1、创建全局eventbus

var EventBus = new Vue();

Object.defineProperties(Vue.prototype, {
  $bus: {
    get: function () {
      return EventBus
    }
  }
})

可以直接在项目中的 main.js 初始化 EventBus :

// main.js
Vue.prototype.$EventBus = new Vue()

在这个特定的总线中使用两个方法$on$emit。一个用于创建发出的事件,它就是$emit;另一个用于订阅$on

var EventBus = new Vue();

this.$bus.$emit('nameOfEvent', { ... pass some event data ...});

this.$bus.$on('nameOfEvent',($event) => {
  // ...
})

然后我们可以在某个Vue页面使用this.$bus.$emit("sendMsg", '我是web秀');,另一个Vue页面使用

this.$bus.$on('updateMessage', function(value) {
  console.log(value); 
})

同时也可以使用this.$bus.$off('sendMsg')来移除事件监听。

Vue通过eventBut实现组件全局通信相关教程

  1. RxJS结合vue-rx, Akita的介绍和使用

    RxJS结合vue-rx, Akita的介绍和使用 介绍 : 解决异步事件。它将一切数据包括HTTP请求,DOM事件或者普通数据等包装成流的形式,然后利用强大丰富的操作符(Operators )对流进行处理,使得用户可以用同步编程的方式处理异步数据。 基本概念 :Observable 类

  2. vue Element 利用Cascader 级联选择器实现三层选择器

    vue Element 利用Cascader 级联选择器实现三层选择器 在这次项目需求中要实现的功能和选择地址的过程是很相似的,就用选择地址的过程来举例:首先是选择省,然后是市,再是某个区。在实际的开发过程中这种场景是很常见的,所以我就分享一下我的实现过程。 效

  3. nginx部署多个vue项目如何配置

    nginx部署多个vue项目如何配置 使用同一域名或者ip去部署访问多个前端项目,比如域名/ip直接访问官网,域名/ip后面带路径去访问其它项目 官网访问地址: http://192.168.27.119/login项目二访问地址:http://192.168.27.119/biz/login项目三访问地址:http://1

  4. 在 vue 中使用 echarts 的详细步骤

    在 vue 中使用 echarts 的详细步骤 年龄大了,果然脑力是跟不上了,这个图表已经用过几次了,每次还是或多或少的出现问题,现在把 echarts 在 vue 中的详细使用步骤记录下来,以备不时之需吧。 echarts 图表绘制的思路是: 1 获取一个有宽高的 DOM 元素 -- 2

  5. Linux/Unix下多进程之间通过共享内存交替读写的例子(一)

    Linux/Unix下多进程之间通过共享内存交替读写的例子(一) 前言 :Linux/Unix系统编程中的一个重要概念是进程以及进程的通信问题。不懂进程、进程通信、共享内存的朋友请出门左传看看基本概念,这里就不再赘述。 逻辑描述 :首先生成一个共享内存区域,通过fo

  6. Jenkins + Maven + Github/Gitlab + Springboot/Vue.js 实现自动

    Jenkins + Maven + Github/Gitlab + Springboot/Vue.js 实现自动化部署 Jenkins用户文档地址 Jenkins在docker环境下安装非常简单。只需要执行命令 docker run \ -u root \ --rm \ -d \ -p 8080:8080 \ -p 50000:50000 \ -v jenkins-data:/var/jenkins_home \

  7. VuePress 侧边栏使用详解

    VuePress 侧边栏使用详解 前言 官网写的侧边栏教程真的是让人很糟心,经过一番摸索,总算大致弄清楚了,下面详细说一下用法: 目录结构: docs根目录下有一个README.md、chinese文件夹、english文件夹 最简侧边栏: sidebar: { '/language/chinese/': [ '', /

  8. Vue 页面加载进度条nprogress的使用

    Vue 页面加载进度条nprogress的使用 前言:客户在访问网页的时候想要看到网页加载的进度,所以使用 nprogress 来实现当页面跳转是出现在浏览器顶部的进度条,它是轻量级的进度条组件,使用简便,可以很方便集成到应用中来。 效果: 一、参考资料 官网:https: