用过Vue,你肯定知道,Vue组件之间的通信常见的有
$dispatch - 通过冒泡的方式传递事件
$broadcast - 通过广播的方式向子孙组件传递事件

如果组件之间的关系只是父-子关系,那么dispatch,broadcast其实就足够了。
但是有天需求变了。登录成功之后,要把用户信息都填上,而需要用户信息的组件不是父组件,而是兄弟组件的后台。
那么事件传递就会变成登录组件向上dispatch到父组件,父组件通过broadcast的方式下发。

example

当然,这个简单的例子不足够证明这样的传递有多糟糕。随着项目和项目成员的壮大,这样的组件通信越多,越不好维护。
所以官方推出了Vuex

vuex

Vuex会让你的Vue代码足够灵活可控,把数据统一存入state, 只允许通过Actions触发Mutations修改。
然而,有时候我们的项目并没有复杂到需要用上Vuex。

这时候你可以考虑使用Event Bus。

Vue实际上在1.几版本的时候就加入了Event Bus,但是好像官方文档中没怎么提到。
作者应该是在Vue的原型对象上注入了,所以只要创建一个Vue对象就够了。

1
2
// bus.js
export default new Vue();

使用$on全局监听(好像这样说不是很正确)

1
2
3
4
5
6
7
8
9
10
11
12
13
import Bus from '../bus.js';

export default {
ready() {
Bus.$on('loadSuccess', text => {
this.show = true;
this.status = 'loadSuccess'
if (text) {
this.text = text;
}
})
},
}

使用$emit触发事件。

1
2
3
4
5
6
7
8
9
ajax({
url: Config.API_ADDRESS_ADD,
type: 'post',
dataType: 'json',
data: data
}).then((data)=>{
Bus.$emit('loadSuccess', '添加成功!');
}).catch((data)=> {
})

使用$once注册一次,触发之后即被销毁。
使用$off解绑事件。

就这么简单。Event Bus非常简单好用,但也有存在隐患,需要注意:

    • 保持良好的团队命名规范,避免冲突,因为所有事件代码都保留在各个组件内部,发生冲突很难 debug。
    • 尽量减少不必要的通信,合理使用props传参。
    • 大型项目,应该一开始就选用vuex

VUe兄弟通信的更多相关文章

  1. Vue 兄弟组件通信(不使用Vuex)

    Vue 兄弟组件通信(不使用Vuex) 项目中,我们经常会遇到兄弟组件通信的情况.在大型项目中我们可以通过引入vuex轻松管理各组件之间通信问题,但在一些小型的项目中,我们就没有必要去引入vuex.下 ...

  2. Vue兄弟组件通信

    Vue兄弟组件通信之借助中央事件总线 下载链接:https://www.yinxiangit.com 其实要实现兄弟组件通信,就算是通过父子组件通信的方式也是可以达到的,如 子 ——>父——&g ...

  3. vuejs兄弟通信$emit和$on

    1   vm.$on( event, callback ) 监听当前实例上的自定义事件.事件可以由vm.$emit触发.回调函数会接收所有传入事件触发函数的额外参数. 2 vm.$emit( even ...

  4. vue 父子通信过程

    1.概述 每个 Vue 实例都实现了事件接口,即: 使用 $on(eventName) 监听事件 使用 $emit(eventName, optionalPayload) 触发事件 2.示例一(未传递 ...

  5. Vue 兄弟组件之间传递数值

    Vue 兄弟组件之间传值 创建一个公用文件夹,在文件夹中设置一个事件处理中心,即 然后在需要设置值的组件中引入该事件处理中心 import Hub from '../../common/eventHu ...

  6. iframe通信相关:父操作子,子操作父,兄弟通信

    这里写window和document是认为代表了BOM和DOM(个人理解不一定对) 拿到了window就能操作全局变量和函数 拿到了document就能获取dom,操作节点 父操作子 window:选 ...

  7. vue组件通信&&v兄弟组件通信eventbus遇到的问题(多次触发、第一次不触发)

    组件通讯包括:父子组件间的通信和兄弟组件间的通信.在组件化系统构建中,组件间通信必不可少的 (vuex以后再说). 父组件--> 子组件 1. 属性设置 父组件关键代码如下: <templ ...

  8. vue 通信:父子通信、兄弟通信、跨多层通信、vuex状态管理

    之前简单做了一次vue通信方法的培训,在此记录一下培训的内容. 关于vue通信,大家最先想到的方法应该是props.ref.$emit.$parent,还有vuex,因为这也是我在项目中最常用到的方法 ...

  9. 关于Vue 兄弟组件通信

    最近项目中遇到希望在操作路由组件里面内容的时候可以影响共用组件Header组件(这个其实就是他的兄弟组件)的操作.  意思就是 router-view指向的router来影响Header组件的信息 首 ...

随机推荐

  1. P2502 [HAOI2006]旅行 最小生成树

    思路:枚举边集,最小生成树 提交:1次 题解:枚举最长边,添加较小边. #include<cstdio> #include<iostream> #include<algo ...

  2. 2019ICPC陕西邀请赛复盘

    题目链接:The 2019 ACM-ICPC China Shannxi Provincial Programming Contest A:签到,按花费时间从小到大排个序 #include<cs ...

  3. 北京清北 综合强化班 Day5

    T1 思路: 输入数据,sort一下, 如果a[i]>sum+1(前缀和) 那么sum+1就一定不会被拼出来, 然后输出即可. 上代码: #include <iostream> #i ...

  4. 二维FFT,IFFT,c语言实现

    学习DIP第6天 完整内容迁移至http://www.face2ai.com/DIP-2-4-二维FFT-IFFT-c语言实现/ http://www.tony4ai.com/DIP-2-4-二维FF ...

  5. JAVA的面向对象1

    如何理解面向对象 我们说面向对象具有三大特征:封装性.继承性和多态性,那么我们怎么去理解所谓的封装.继承.多态? 1.封装:功能都给你做好了,你不必去理解它是怎么写出来的,直接使用即可. 如:房子.电 ...

  6. CDialog::DoModal()问题和_WIN32_WINNT

    1.从CDialogEx派生自己的CMyDialog,到DoModal()时总提示 error C2039: "DoModal": 不是"CMyDialog"的 ...

  7. RabbitMQ的下载与安装

    RabbitMQ的安装注意事项: 1. 系统的管理员账户不能是中文(win8) 2. 计算机名不能是中文(win8) 3. 推荐:使用默认的安装目录 4. 使用的计算机用户必须是管理员 如果安装不成功 ...

  8. 转:Jmeter文件上传、下载

    一.上传/下载的过程.        上传的过程就是你把你本地的文件,扔到服务器上的这么一个过程.        下载呢,就是把服务器上的文件拿过来,然后存到你本地的这么一个过程.        总结 ...

  9. BDD行为驱动简介及Pytest-bdd基础使用

    目录 BDD介绍 需求描述/用户场景 场景解析/实现 场景测试 Pytest-bdd的参数化 运行环境: pip insall pytest pytest-bdd pytest-selenium BD ...

  10. 索引有B+索引和hash索引,各自的区别

    Hash索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B+树索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,那为什么大家不都用Hash索引而还要使用B+树索引呢? ...