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"> ...
随机推荐
- CentOS工作内容(七)禁用IPV6
CentOS工作内容(七)禁用IPV6 用到的快捷键 tab 自动补齐(有不知道的吗) ctrl+a 移动到当前行的开头(a ahead) ctrl+e 移动到当前行的开头(e end) ctrl+u ...
- 实习培训——Java基础(3)
实习培训——Java基础(3) 1 Java 继承 1.1 super和this关键字 super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类. this关键字 ...
- MVC中的传参并在View中获取
首先action跳转的模式有如下: redirecttoaction("index");//一个参数时在本controller下,不传入参数. redirecttoaction(a ...
- Mantle 与Injection
本来Injection可以本地打补丁实时修改代码,但是不知道Mantle的数据类为何不能打补丁,可能因为Mantle利用了很多运行时的技术吧.
- SpringMyBatisDay01
1.Spring简介 Spring是一个开源轻量级应用开发框架,其目的是用于简化企业级应用程序的开发,降低侵入性Spring提供IOC和AOP功能,可以将组件(就是类)之间的耦合度降至最低,解耦,便于 ...
- chrome浏览器使用
1.如何打开多个历史网页.这个需求是这样的,有时候开了多个网页查找资料,但是又还没有做完,然后又需要重启电脑.显然重启电脑后再开启浏览器,一般都是显示浏览器的主页了,上次开的那些网页全部在历史记录里面 ...
- LR和SVM的相同和不同
之前一篇博客中介绍了Logistics Regression的理论原理:http://www.cnblogs.com/bentuwuying/p/6616680.html. 在大大小小的面试过程中,经 ...
- 全文搜索引擎ElasticSearch学习记录:mac下安装
最近开发组培训了ElasticSearch,准备开展新项目,我也去凑了下热闹,下面把学习过程记录一下. 一.安装 1.环境需要jdk1.8; 2.下载:http://www.elastic.co/do ...
- Hive学习之路 (五)DbVisualizer配置连接hive
一.安装DbVisualizer 下载地址http://www.dbvis.com/ 也可以从网上下载破解版程序,此处使用的版本是DbVisualizer 9.1.1 具体的安装步骤可以百度,或是修改 ...
- C/C++笔记 #035# Makefile
相关资料: Understanding roles of CMake, make and GCC GCC and Make ( A simple tutorial, teaches u how to ...