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 相关文章推荐
jQuery-Easyui 1.2 实现多层菜单效果的代码
Jan 13 Javascript
javascript实现table表格隔行变色的方法
May 13 Javascript
果断收藏9个Javascript代码高亮脚本
Jan 06 Javascript
javascript之Boolean类型对象
Jun 07 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
Dec 23 Javascript
JavaScript函数中的this四种绑定形式
Aug 15 Javascript
JavaScript 完成注册页面表单校验的实例
Aug 19 Javascript
浅谈vue-cli 3.0.x 初体验
Apr 11 Javascript
关于layui toolbar和template的结合使用方法
Sep 19 Javascript
关于vue利用postcss-pxtorem进行移动端适配的问题
Nov 20 Javascript
微信小程序之左右布局的实现代码
Dec 13 Javascript
flexible.js实现移动端rem适配方案
Apr 07 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
mysql_num_rows VS COUNT 效率问题分析
2011/04/23 PHP
教你如何使用php session
2013/10/28 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
2015/01/28 PHP
PHP中的Iterator迭代对象属性详解
2019/04/12 PHP
JavaScript 设计模式学习 Factory
2009/07/29 Javascript
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
Jquery调用webService远程访问出错的解决方法
2010/05/21 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
jQuery代码实现对话框右上角菜单带关闭×
2016/05/03 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
JavaScript实现窗口抖动效果
2016/10/19 Javascript
微信开发 使用picker封装省市区三级联动模板
2016/10/28 Javascript
BootStrap Validator 版本差异问题导致的submitHandler失效问题的解决方法
2016/12/01 Javascript
AngularJS过滤器filter用法分析
2016/12/11 Javascript
JavaScript操作文件_动力节点Java学院整理
2017/06/30 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
2017/08/16 Javascript
vue-router实现tab标签页(单页面)详解
2017/10/17 Javascript
微信小程序image图片加载完成监听
2019/08/31 Javascript
vue 中 elment-ui table合并上下两行相同数据单元格
2019/12/26 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
Python使用lxml模块和Requests模块抓取HTML页面的教程
2016/05/16 Python
tensorflow如何批量读取图片
2019/08/29 Python
python统计文章中单词出现次数实例
2020/02/27 Python
Python通过kerberos安全认证操作kafka方式
2020/06/06 Python
详解pycharm2020.1.1专业版安装指南(推荐)
2020/08/07 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
2020/08/20 Python
Ivory Isle Designs美国/加拿大:婚礼和活动文具公司
2018/08/21 全球购物
杭州-DOTNET笔试题集
2013/09/25 面试题
房地产开发计划书
2014/01/10 职场文书
遗产继承公证书
2014/04/09 职场文书
婚假请假条怎么写
2014/04/10 职场文书
2015年业务员工作总结范文
2015/04/07 职场文书
工会文体活动总结
2015/05/07 职场文书
2019大学生预备党员转正思想汇报
2019/06/21 职场文书
导游词之金鞭溪风景区
2019/09/12 职场文书
在js中修改html body的样式
2021/11/11 Javascript