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实现组件全局通信相关教程
-
RxJS结合vue-rx, Akita的介绍和使用
RxJS结合vue-rx, Akita的介绍和使用 介绍 : 解决异步事件。它将一切数据包括HTTP请求,DOM事件或者普通数据等包装成流的形式,然后利用强大丰富的操作符(Operators )对流进行处理,使得用户可以用同步编程的方式处理异步数据。 基本概念 :Observable 类
-
vue Element 利用Cascader 级联选择器实现三层选择器
vue Element 利用Cascader 级联选择器实现三层选择器 在这次项目需求中要实现的功能和选择地址的过程是很相似的,就用选择地址的过程来举例:首先是选择省,然后是市,再是某个区。在实际的开发过程中这种场景是很常见的,所以我就分享一下我的实现过程。 效
-
nginx部署多个vue项目如何配置
nginx部署多个vue项目如何配置 使用同一域名或者ip去部署访问多个前端项目,比如域名/ip直接访问官网,域名/ip后面带路径去访问其它项目 官网访问地址: http://192.168.27.119/login项目二访问地址:http://192.168.27.119/biz/login项目三访问地址:http://1
-
在 vue 中使用 echarts 的详细步骤
在 vue 中使用 echarts 的详细步骤 年龄大了,果然脑力是跟不上了,这个图表已经用过几次了,每次还是或多或少的出现问题,现在把 echarts 在 vue 中的详细使用步骤记录下来,以备不时之需吧。 echarts 图表绘制的思路是: 1 获取一个有宽高的 DOM 元素 -- 2
-
Linux/Unix下多进程之间通过共享内存交替读写的例子(一)
Linux/Unix下多进程之间通过共享内存交替读写的例子(一) 前言 :Linux/Unix系统编程中的一个重要概念是进程以及进程的通信问题。不懂进程、进程通信、共享内存的朋友请出门左传看看基本概念,这里就不再赘述。 逻辑描述 :首先生成一个共享内存区域,通过fo
-
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 \
-
VuePress 侧边栏使用详解
VuePress 侧边栏使用详解 前言 官网写的侧边栏教程真的是让人很糟心,经过一番摸索,总算大致弄清楚了,下面详细说一下用法: 目录结构: docs根目录下有一个README.md、chinese文件夹、english文件夹 最简侧边栏: sidebar: { '/language/chinese/': [ '', /
-
Vue 页面加载进度条nprogress的使用
Vue 页面加载进度条nprogress的使用 前言:客户在访问网页的时候想要看到网页加载的进度,所以使用 nprogress 来实现当页面跳转是出现在浏览器顶部的进度条,它是轻量级的进度条组件,使用简便,可以很方便集成到应用中来。 效果: 一、参考资料 官网:https: