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 相关文章推荐
用Javascript评估用户输入密码的强度(Knockout版)
Nov 30 Javascript
js局部刷新页面时间具体实现
Jul 04 Javascript
纯文字版返回顶端的js代码
Aug 01 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
Jan 08 Javascript
Vuejs第十一篇组件之slot内容分发实例详解
Sep 09 Javascript
jquery遍历标签中自定义的属性方法
Sep 17 Javascript
Angular.js中下拉框实现渲染html的方法
Jun 18 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
Oct 15 jQuery
javascript连接mysql与php通过odbc连接任意数据库的实例
Dec 27 Javascript
vue使用xe-utils函数库的具体方法
Mar 06 Javascript
vue-cli 引入、配置axios的方法
May 08 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
Aug 06 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
php面向对象全攻略 (八)重载新的方法
2009/09/30 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
2016/07/15 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
VSCode+PHPstudy配置PHP开发环境的步骤详解
2020/08/20 PHP
用jquery来定位
2007/02/20 Javascript
jQuery 连续列表实现代码
2009/12/21 Javascript
StringTemplate遇见jQuery冲突的解决方法
2011/09/22 Javascript
Prototype的Class.create函数解析
2011/09/22 Javascript
javascript获取隐藏dom的宽高 具体实现
2013/07/14 Javascript
node.js中的console.warn方法使用说明
2014/12/09 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
2016/04/14 Javascript
Node.js读写文件之批量替换图片的实现方法
2016/09/07 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
2017/02/03 Javascript
微信小程序 标签传入数据
2017/05/08 Javascript
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
jQuery实现每日秒杀商品倒计时功能
2019/09/06 jQuery
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
jquery实现拖拽添加元素功能
2020/12/01 jQuery
代码分析Python地图坐标转换
2018/02/08 Python
PyQt QListWidget修改列表项item的行高方法
2019/06/20 Python
OpenCV中VideoCapture类的使用详解
2020/02/14 Python
Python利用PyPDF2库获取PDF文件总页码实例
2020/04/03 Python
python3 使用openpyxl将mysql数据写入xlsx的操作
2020/05/15 Python
Python pandas对excel的操作实现示例
2020/07/21 Python
python collections模块的使用
2020/10/16 Python
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
canvas仿写贝塞尔曲线的示例代码
2017/12/29 HTML / CSS
Europcar比利时:租车
2019/08/26 全球购物
介绍一下RMI的基本概念
2016/12/17 面试题
高中生自我评价个人范文
2013/11/09 职场文书
绩效管理实施方案
2014/03/19 职场文书
社区两委对照检查材料
2014/08/23 职场文书
不尊敬老师的检讨书
2014/12/21 职场文书
车间主任岗位职责
2015/02/03 职场文书
2016入党培训心得体会范文
2016/01/08 职场文书