vue Bus总线
有时候两个组件也需要通信(非父子关系)。当然Vue2.0提供了Vuex,但在简单的场景下,可以使用一个空的Vue实例作为中央事件总线。
参考:http://blog.csdn.net/u013034014/article/details/54574989?locationNum=2&fps=1
例子:https://segmentfault.com/q/1010000007491994
- <div id="app">
- <c1></c1>
- <c2></c2>
- </div>
- var Bus = new Vue(); //为了方便将Bus(空vue)定义在一个组件中,在实际的运用中一般会新建一Bus.js
- Vue.component('c1',{ //这里已全局组件为例,同样,单文件组件和局部组件也同样适用
- template:'<div>{{msg}}</div>',
- data: () => ({
- msg: 'Hello World!'
- }),
- created() {
- Bus.$on('setMsg', content => {
- this.msg = content;
- });
- }
- });
- Vue.component('c2',{
- template: '<button @click="sendEvent">Say Hi</button>',
- methods: {
- sendEvent() {
- Bus.$emit('setMsg', 'Hi Vue!');
- }
- }
- });
- var app= new Vue({
- el:'#app'
- })
在实际运用中,一般将Bus抽离出来:
Bus.js
- import Vue from 'vue'
- const Bus = new Vue()
- export default Bus
组件调用时先引入
组件1
- import Bus from './Bus'
- export default {
- data() {
- return {
- .........
- }
- },
- methods: {
- ....
- Bus.$emit('log', 120)
- },
- }
组件2
- import Bus from './Bus'
- export default {
- data() {
- return {
- .........
- }
- },
- mounted () {
- Bus.$on('log', content => {
- console.log(content)
- });
- }
- }
但这种引入方式,经过webpack打包后可能会出现Bus局部作用域的情况,即引用的是两个不同的Bus,导致不能正常通信
运用二:
当然也可以直接将Bus注入到Vue根对象中,
- import Vue from 'vue'
- const Bus = new Vue()
- var app= new Vue({
- el:'#app',
- data:{
- Bus
- }
- })
在子组件中通过this.$root.Bus.$on(),this.$root.Bus.$emit()来调用
运用三:
将bus挂载到vue.prototype上(这里用了插件的写法)
- // plugin/index.js
- import Bus from 'vue';
- let install = function (Vue) {
- ... ...
- // 设置eventBus
- Vue.prototype.bus = new Bus();
- ... ...
- }
- export default {install};
- // main.js
- import Vue from 'vue';
- import plugin from './plugin/index';
- ... ...
- Vue.use(plugin);
- ... ...
组件一中定义
- ... ...
- created () {
- this.bus.$on('updateData', this.getdata);
- }
组件二中调用
- this.bus.$emit('updateData', {loading: false});
注意:注册的总线事件要在组件销毁时卸载,否则会多次挂载,造成触发一次但多个响应的情况
- beforeDestroy () {
- this.bus.$off('updateData', this.getData);
- }
vue Bus总线的更多相关文章
- vue组件中—bus总线事件回调函数多次执行的问题
在利用vue组件进行事件监听时发现,如果对N个vue组件实例的bus总线绑定同一事件的回调函数,触发任意组件的对应事件,回调函数至少会被执行N次,这是为什么呢? 为此,调研了普通对象的事件绑定和触发实 ...
- vue bus 的使用
简单的状态管理,可以用vue bus vue bus可以实现不同组件间.不同页面间的通信,比如我在A页面出发点击事件,要B页面发生变化,使用方法如下: 全局定义:main.js window.even ...
- vue bus 中央事件总线
1.全局定义bus 新建src/eventBus.js 文件 import Vue from 'vue' export default new Vue() // 全局引入mai.jsvue中央事件总 ...
- Vue bus的使用(兄弟|非父子组件传值)-->可以使用一个空的Vue实例作为中央事件总线new Vue()
1.在main.js中注册全局的bus Vue.prototype.bus=new Vue(); 2.在组建中使用 子组建使用:this.bus.$emit('自定义事件名',data) metho ...
- Vue中兄弟组件间传值-(Bus/总线/发布订阅模式/观察者)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue 非父子组件之间的传值(Bus/总线/发布订阅模式/观察者模式)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- vue 事件总线(bus)
1.全局引入bus Vue.prototype.$bus = new.Vue() 2.组件间传值使用(在发送事件时接收组件会实时接收到, 可以用做兄弟组件间相互传值, 但页面跳转组件间有问题 通过$e ...
- Vue事件总线(eventBus)$on()会多次触发解决办法
项目中使用了事件总线eventBus来进行两个组件间的通信, 使用方法是是建立eventBus.js文件,暴露一个空的Vue实例,如下: import Vue from 'vue'export def ...
- vue bus的使用
vue中的bus事件,一般作为中央事件总线来使用 简单例子:比如在A,B组件为兄弟组件,现在A要调用B的中C事件 1.创建一个bus.js 内容: import Vue from 'vue' cons ...
随机推荐
- 2018 Multi-University Training Contest 1 杭电多校第一场
抱着可能杭电的多校1比牛客的多校1更恐怖的想法 看到三道签到题 幸福的都快哭出来了好吗 1001 Maximum Multiple(hdoj 6298) 链接:http://acm.hdu.edu. ...
- Matplotlib(used in paper)
1. 转自:matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域 注:如果不采用 subplot_adjust + margin(0,0),而是在fig.savefig( ...
- 代码学习-Linux内核网卡收包过程(NAPI)【转】
转自:https://blog.csdn.net/crazycoder8848/article/details/46333761 版权声明:本文没有任何版权限制,任何人可以以任何方式使用本文. htt ...
- requests库入门11-重定向和请求历史
默认情况下,除了head请求,requests会自动处理重定向 重定向就是会把url重新指定到另一个.比如github,使用http会自动重定向到https.一些公司也会使用网关啥的做重定向. r = ...
- Python3学习笔记03-基础数据类型
Python 中的变量不需要声明.每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对 ...
- JavaScript拼接html字符串时截断问题
在项目中碰到一个问题,就是JavaScript拼接html标签时,里面特殊字符会有些问题,比如单引号截断配对,导致后面的内容不显示或显示错误.在此记录一下. 下面贴一段简化的代码,若有描述不清的地方还 ...
- SharePoint 2013 错误 0x800700DF 文件大小超出允许的限制,无法保存
问题描述: 利用资源管理员往SharePoint 2013文档库里复制文件时,报错了. 错误 0x800700DF︰ 文件大小超过了允许的限制,无法保存. 解决方法: 解决方法,可以修改本地电脑注册表 ...
- <第一站>人生的第一个博客
在畅畅的疯狂暗示下(“最好”建个博客),我决定在博客园开通我的博客,在此记入我从3月23起的所学所想.在他的提醒之前,我曾经断断续续的在日记本上,手机备忘录里记录过我的学习情况和心路历程,总的来说,自 ...
- MySQL新增多个字段
alter table pic_all add ( `expand1` ), `expand2` ), `expand3` ) );
- 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 ...