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 相关文章推荐
js对象的构造和继承实现代码
Dec 05 Javascript
a标签的href和onclick 的事件的区别介绍
Jul 26 Javascript
javascript学习笔记(二)数组和对象部分
Sep 30 Javascript
JavaScript中的parse()方法使用简介
Jun 12 Javascript
jQuery给元素添加样式的方法详解
Dec 30 Javascript
Mint UI 基于 Vue.js 移动端组件库
Nov 07 Javascript
angularjs 动态从后台获取下拉框的值方法
Aug 13 Javascript
vue实现搜索功能
May 28 Javascript
JavaScript创建表格的方法
Apr 13 Javascript
electron 如何将任意资源打包的方法步骤
Apr 16 Javascript
JS中forEach()、map()、every()、some()和filter()的用法
May 11 Javascript
js 实现验证码输入框示例详解
Sep 23 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无限分类的深入理解
2013/06/02 PHP
PHP面向对象程序设计之多态性的应用示例
2018/12/19 PHP
php+js实现的无刷新下载文件功能示例
2019/08/23 PHP
js中将URL中的参数提取出来作为对象的实现代码
2011/08/16 Javascript
jquery ui dialog实现弹窗特效的思路及代码
2013/08/03 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
Javascript中的return作用及javascript return关键字用法详解
2015/11/05 Javascript
JS中Eval解析JSON字符串的一个小问题
2016/02/21 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
2016/06/28 Javascript
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
微信小程序实现瀑布流布局与无限加载的方法详解
2017/05/12 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
2017/12/14 Javascript
vue路由--网站导航功能详解
2019/03/29 Javascript
vue实现表格过滤功能
2019/09/27 Javascript
[01:10:58]KG vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
使用grappelli为django admin后台添加模板
2014/11/18 Python
深入了解Python数据类型之列表
2016/06/24 Python
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
Python实现判断一个字符串是否包含子串的方法总结
2017/11/21 Python
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
代码实例讲解python3的编码问题
2019/07/08 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
在matplotlib中改变figure的布局和大小实例
2020/04/23 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
Python 跨.py文件调用自定义函数说明
2020/06/01 Python
python dict乱码如何解决
2020/06/07 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
2021/02/18 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
解决python的空格和tab混淆而报错的问题
2021/02/26 Python
Html5移动端获奖无缝滚动动画实现示例
2018/06/25 HTML / CSS
活动总结报告范文
2014/05/04 职场文书
陈斌强事迹观后感
2015/06/17 职场文书
职工培训工作总结
2015/08/10 职场文书
Python接口自动化之文件上传/下载接口详解
2022/04/05 Python
html解决浏览器记住密码输入框的问题
2023/05/07 HTML / CSS