Vue组件通信之Bus的具体使用


Posted in Javascript onDecember 28, 2017

关于组件通信我相信小伙伴们肯定也都很熟悉,就不多说了,对组件通信还不熟悉的小伙伴移步这里。

在vue2.0中 $dispatch 和 $broadcast 已经被弃用。官方文档中给出的解释是:

因为基于组件树结构的事件流方式实在是让人难以理解,并且在组件结构扩展的过程中会变得越来越脆弱。这种事件方式确实不太好,我们也不希望在以后让开发者们太痛苦。并且$dispatch 和 $broadcast 也没有解决兄弟组件间的通信问题。

官方推荐的状态管理方案是 Vuex。不过如果项目不是很大,状态管理也没有很复杂的话,使用 Vuex 有种杀鸡用牛刀的感觉,当然,这也是要根据自己的需求来的,只是建议。

vue官方文档中有这样一个定义:非父子组件的通信,内容很少,如下:

Vue组件通信之Bus的具体使用

其实关于这个非父子组件通信的demo还是有的,它藏在了$dispatch 和 $broadcast的迁移文档中,有兴趣的小伙伴可以点击进去查看。文档中的建议就是:

对于$dispatch 和 $broadcast最简单的升级方式就是:通过使用事件中心,允许组件自由交流,无论组件处于组件树的哪一层。由于 Vue 实例实现了一个事件分发接口,你可以通过实例化一个空的 Vue 实例来实现这个目的。
这个集中式的事件中间件就是 Bus。我习惯将bus定义到全局:

app.js

var eventBus = {
 install(Vue,options) {
  Vue.prototype.$bus = vue
 }
};
Vue.use(eventBus);

然后在组件中,可以使用$emit, $on, $off 分别来分发、监听、取消监听事件:

分发事件的组件

// ...
methods: {
 todo: function () {
 this.$bus.$emit('todoSth', params); //params是传递的参数
 //...
 }
}

监听的组件

// ...
created() {
 this.$bus.$on('todoSth', (params) => { //获取传递的参数并进行操作
  //todo something
 })
},
// 最好在组件销毁前
// 清除事件监听
beforeDestroy () {
 this.$bus.$off('todoSth');
},

如果需要监听多个组件,只需要更改 bus 的 eventName:

// ...
created() {
 this.$bus.$on('firstTodo', this.firstTodo);
 this.$bus.$on('secondTodo', this.secondTodo);
},
// 清除事件监听
beforeDestroy () {
 this.$bus.$off('firstTodo', this.firstTodo);
 this.$bus.$off('secondTodo', this.secondTodo);
},

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
云网广告中的代码,提示出错,大家找找
Nov 21 Javascript
改进:论坛UBB代码自动插入方式
Dec 22 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
Jan 25 Javascript
javascript:;与javascript:void(0)使用介绍
Jun 05 Javascript
jQuery响应鼠标事件并隐藏与显示input默认值
Aug 24 Javascript
JQuery中基础过滤选择器用法实例分析
May 18 Javascript
JavaScript获取两个数组交集的方法
Jun 09 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
Aug 19 Javascript
jQuery中Nicescroll滚动条插件的用法
Nov 10 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
Feb 22 Javascript
微信小程序url与token设置详解
Sep 26 Javascript
VueCli3.0中集成MockApi的方法示例
Jul 05 Javascript
基于Swiper实现移动端页面图片轮播效果
Dec 28 #Javascript
Swiper自定义分页器使用详解
Dec 28 #Javascript
swiper自定义分页器使用方法详解
Sep 14 #Javascript
JavaScript实现数值自动增加动画
Dec 28 #Javascript
详解如何优雅地在React项目中使用Redux
Dec 28 #Javascript
ionic3实战教程之随机布局瀑布流的实现方法
Dec 28 #Javascript
JS实现带动画的回到顶部效果
Dec 28 #Javascript
You might like
回首过去10年中最搞笑的10部动漫,哪一部让你节操尽碎?
2020/03/03 日漫
不错的PHP学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
一个php Mysql类 可以参考学习熟悉下
2009/06/21 PHP
php分页函数完整实例代码
2014/09/22 PHP
CI框架中cookie的操作方法分析
2014/12/12 PHP
PHP中preg_match正则匹配中的/u、/i、/s含义
2015/04/17 PHP
正确的PHP匹配UTF-8中文的正则表达式
2015/05/13 PHP
php简单实现发送带附件的邮件
2015/06/10 PHP
thinkPHP3.2简单实现文件上传的方法
2016/05/16 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
2018/04/27 PHP
innerText和textContent对比及使用介绍
2013/02/27 Javascript
javascript强大的日期函数代码分享
2013/09/04 Javascript
javascript避免数字计算精度误差的方法详解
2014/03/05 Javascript
js 函数式编程学习笔记
2017/03/25 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
2018/04/10 Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
2019/04/02 Javascript
使用element-ui的el-menu导航选中后刷新页面保持当前选中状态
2019/07/19 Javascript
Vue通过WebSocket建立长连接的实现代码
2019/11/05 Javascript
浅谈Vue.js之初始化el以及数据的绑定说明
2019/11/14 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
2020/11/04 Javascript
[36:54]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[01:00:10]完美世界DOTA2联赛PWL S2 FTD vs Inki 第二场 11.21
2020/11/24 DOTA
python中Pycharm 输出中文或打印中文乱码现象的解决办法
2017/06/16 Python
python 移除字符串尾部的数字方法
2018/07/17 Python
python文件操作之批量修改文件后缀名的方法
2018/08/10 Python
用python标准库difflib比较两份文件的异同详解
2018/11/16 Python
python占位符输入方式实例
2019/05/27 Python
python的常见矩阵运算(小结)
2019/08/07 Python
PyCharm使用Docker镜像搭建Python开发环境
2019/12/26 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
2020/06/03 Python
Myprotein亚太地区:欧洲第一在线运动营养品牌
2020/12/20 全球购物
经典优秀个人求职自荐信格式
2013/09/25 职场文书
2014年大学生自我评价
2014/01/19 职场文书
总经理检讨书
2014/09/15 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电