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 04 Javascript
将查询条件的input、select清空
Jan 14 Javascript
javascript实现一个数值加法函数
Jun 26 Javascript
基于jQuery实现select下拉选择可输入附源码下载
Feb 03 Javascript
文本框只能输入数字的js代码(含小数点)
Jul 10 Javascript
javaScript语法总结
Nov 25 Javascript
VueJs与ReactJS和AngularJS的异同点
Dec 12 Javascript
JS实现的RGB网页颜色在线取色器完整实例
Dec 21 Javascript
Vue+Element实现动态生成新表单并添加验证功能
May 23 Javascript
详解vue父子组件关于模态框状态的绑定方案
Jun 05 Javascript
bootstrap table插件动态加载表头
Jul 19 Javascript
基于postman获取动态数据过程详解
Sep 08 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中将汉字转换成拼音的函数代码
2012/09/08 PHP
简单说说PHP优化那些事(经验分享)
2014/11/27 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
PHP限制HTML内容中图片必须是本站的方法
2015/06/16 PHP
学习php设计模式 php实现门面模式(Facade)
2015/12/07 PHP
Zend Framework入门知识点小结
2016/03/19 PHP
微信支付开发维权通知实例
2016/07/12 PHP
Smarty日期时间操作方法示例
2016/11/15 PHP
js中的this关键字详解
2013/09/25 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
2014/07/02 Javascript
JavaScript入门教程之引用类型
2016/05/04 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
任意Json转成无序列表的方法示例
2016/12/09 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
vue移动端监听滚动条高度的实现方法
2018/09/03 Javascript
Vue 配合eiement动态路由,权限验证的方法
2018/09/26 Javascript
Javascript中parseInt的正确使用方式
2018/10/17 Javascript
浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)
2018/11/08 Javascript
改变layer confirm弹窗按钮的颜色方法
2019/09/12 Javascript
layui上传图片到服务器的非项目目录下的方法
2019/09/26 Javascript
深入理解Antd-Select组件的用法
2020/02/25 Javascript
Vue + Scss 动态切换主题颜色实现换肤的示例代码
2020/04/27 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
Python读取环境变量的方法和自定义类分享
2014/11/22 Python
Python中shutil模块的常用文件操作函数用法示例
2016/07/05 Python
python 编程之twisted详解及简单实例
2017/01/28 Python
python实现nao机器人身体躯干和腿部动作操作
2019/04/29 Python
python有序查找算法 二分法实例解析
2020/02/18 Python
Window系统下Python如何安装OpenCV库
2020/03/05 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
老师对学生的评语
2014/04/18 职场文书
一帮一活动总结
2014/05/08 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
《风娃娃》教学反思
2016/02/18 职场文书
2019新员工试用期转正申请书3篇
2019/08/13 职场文书
python 批量压缩图片的脚本
2021/06/02 Python