Vue开发中的中央事件总线
在Vue开发中会遇到大量的组件之间共享数据的情形,针对不同的情形,Vue有相对应的解决方案。比如,父组件向子组件传值可以使用props,复杂项目中不同模块之间传值可以使用Vuex。但是,对于一些简单的项目里的非父子组件来说,它们一方面不适用props,另一方面又没有必要使用Vuex,针对这种情形可以使用中央事件总线(Event Bus)来解决问题。
1、创建中央事件总线
可以使用多种形式创建Event Bus。
Example 1:
// main.js
import Vue from 'vue';
window.eventBus = new Vue(); // 注册全局事件对象
// 也可以修改Vue的原型链
Vue.prototype.$event = new Vue();
Example 2:
// ./event/moduleEvent.vue
<tempalte>
</template>
<script>
import Vue from 'vue';
export default new Vue({
data () { }
})
</script>
// main.js
import moduleEvent from './event/moduleEvent';
Vue.prototype.$event = moduleEvent;
Example 3:
// Example 2 中的创建eventBus的vue文件改为js文件,main.js不变
// ./event/moduleEvent.js
inport Vue from 'vue';
export const moduleEvent = new Vue();
// main.js
import moduleEvent from '../event/moduleEvent';
Vue.prototype.$event = moduleEvent;
2、使用中央事件总线传值
先在组件A中发射事件:
// moduleA.vue
methods: {
sendData () {
// 通过修改Vue原型链的方式注册
this.$event.$emit('dataFromA', this.dataA);
// 直接注册在window上
// moduleEvent.$emit('dataFromA', this.dataA);
}
}
然后就可以在组件B中接收了。组件B可以与组件A是父子、兄弟等等任意关系。
// moduleB.vue
methods: {
getData () {
// 通过修改Vue原型链的方式注册
this.$event.$on('dataFromA', function (data) {
// handle data code
// 回调函数的参数data即为组件A传递的值
});
// 直接注册在window上
// moduleEvent.$emit('dataFromA', function (data) {
// handle data code
// 回调函数的参数data即为组件A传递的值
// });
}
}
3、单次接收事件或者移除事件Listeners
如果你只想监听一次该事件。可以使用 this.$event.$once(channel: string, callback(payload1, payload2, ...)),事件触发一次后将移除事件。
如果你想移除自定义事件监听器,你可以使用 this.$event.$off([event, callback]); 来实现。该方法如果没有提供参数,则移除所有的事件监听器;如果只提供事件,则移除该事件所有的监听器;如果同时提供了事件与回调,则只移除这个回调的监听器。
Vue开发中的中央事件总线的更多相关文章
- 记一笔vue中的中央事件总线的问题,以及解决方案
代码结构:首先HeaderNav组件是被单独拎出来的,router-view中就对应了内容组件,由于有时候i有的界面的header内容是不一样的,因此要用到兄弟组件的相互通信,这个时候我首先选择了bu ...
- python 全栈开发,Day91(Vue实例的生命周期,组件间通信之中央事件总线bus,Vue Router,vue-cli 工具)
昨日内容回顾 0. 组件注意事项!!! data属性必须是一个函数! 1. 注册全局组件 Vue.component('组件名',{ template: `` }) var app = new Vue ...
- vue笔记 - 组件间通信 之 中央事件总线bus
中央事件总线 - 就是一个名字可以叫做bus的vue空实例,里边没有任何内容: var bus = new Vue(); 人如其名,她就像一个公交车一样,来回输送人,将a站点的A输送到b站点,再将b站 ...
- vue组件之间的传值——中央事件总线与跨组件之间的通信($attrs、$listeners)
vue组件之间的通信有很多种方式,最常用到的就是父子组件之间的传值,但是当项目工程比较大的时候,就会出现兄弟组件之间的传值,跨级组件之间的传值.不可否认,这些都可以类似父子组件一级一级的转换传递,但是 ...
- vue bus 中央事件总线
1.全局定义bus 新建src/eventBus.js 文件 import Vue from 'vue' export default new Vue() // 全局引入mai.jsvue中央事件总 ...
- 如何在 pyqt 中实现全局事件总线
前言 在 Qt 中可以使用信号和槽机制很方便地实现部件之间的通信,考虑下面这样的场景: 我想要点击任意一个专辑卡并通知主界面跳转到专辑界面,那么一种实现方式如上图所示:点击任意一个蓝色方框所示的专辑卡 ...
- vue开发中的"骚操作"
前言 在与同事协作开发的过程中,见识到了不少"骚操作".因为之前都没用过,所以我愿称之为"高级技巧"! Vue.extend 在交互过程中,有个需求就是点击图标 ...
- vue中央事件总线eventBus的简单理解和使用
公共事件总线eventBus的实质就是创建一个vue实例,通过一个空的vue实例作为桥梁实现vue组件间的通信.它是实现非父子组件通信的一种解决方案. 用法如下: 第一步:项目中创建一个js文件(我通 ...
- onscroll事件没有响应的原因以及vue.js中添加onscroll事件监听的方法
1 onscroll事件失效 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
随机推荐
- CentOS7安装Nmon(linux性能监控工具)
Nmon开源性能监控工具,用于监控linux系统的资源消耗信息,并能把结果输出到文件中,然后通过nmon_analyser工具产生数据文件与图形化结果. 目录 一.安装软件二.实时监控三.数据采集四. ...
- css实现固定行
如果实现单行文本的溢出显示省略号同学们应该都知道用text-overflow:ellipsis属性来,当然还需要加宽度width属来兼容部分浏览. 实现方法: overflow: hidden; te ...
- Selenium+Java元素定位之三
首先自己先准备一个表格代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- jmeter处理带表单的接口请求
如何用jmeter处理带选项的表单接口请求 下面是用到了F12 抓包的处理方法 下图是直接手动在页面上请求的结果 下面就是采用F12抓包抓到url 和FormData 分别把上面获取的url和Form ...
- Rpgmakermv(5) MiniLabel插件介绍
============================================================================ Introduction ========== ...
- TestDriven.NET 怎么设置快捷键keyboard shortcut(转)
TestDriven.NET 怎么设置快捷键keyboard shortcut 使用TestDriven.NET 测试的时候,觉得点击鼠标很麻烦是不是?嗯,我也觉得,那么我们来看看怎么设置它的快捷键把 ...
- 搭建Linux-java web运行环境之一:安装jdk+tomcat
环境 OS:Red Hat Enterprise Linux Server release 7.3 (Maipo) JDK:jdk-7u80-linux-x64.tar.gz Tomcat:apach ...
- jstat命令查看jvm的GC情况
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量.命令的格式如下: jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数] 注意!!!:使用的jdk版本是jdk8. ...
- 应用程序无法正常启动0xc000007b怎么解决
解决方法两种: 1. 网上搜索中最常见的,缺少DirectX 9 ,去下载一个安上就OK了. 2.第二种情况比较操蛋,其实报的错误应该是:mfc100u.dll丢失 .我在两台电脑上装了相同系统后,台 ...
- 【译】理解node.js事件轮询
Node.js的第一个基本论点是I/O开销很大. 当前编程技术中等待I/O完成会浪费大量的时间.有几种方法可以处理这种性能上的影响: 同步:每次处理一个请求,依次处理.优点:简单:缺点:任何一个请求都 ...