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 常用操作整理 基础入门篇
Oct 14 Javascript
javascript showModalDialog,open取得父窗口的方法
Mar 10 Javascript
Js组件的一些写法
Sep 10 Javascript
JS清空多文本框、文本域示例代码
Feb 24 Javascript
jQuery实现html元素拖拽
Jul 21 Javascript
精通JavaScript的this关键字
May 28 Javascript
Vue2.0 多 Tab切换组件的封装实例
Jul 28 Javascript
AngularJS监听ng-repeat渲染完成的两种方法
Jan 16 Javascript
Vue2.0系列之过滤器的使用
Mar 01 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
Sep 27 Javascript
layui在form表单页面通过Validform加入简单验证的方法
Sep 06 Javascript
vue 内联样式style中的background用法说明
Aug 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
php的一些小问题
2010/07/03 PHP
PHP中执行MYSQL事务解决数据写入不完整等情况
2014/01/07 PHP
JS的IE和Firefox兼容性集锦
2006/12/11 Javascript
锋利的jQuery jQuery中的DOM操作
2010/03/21 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
jquery 笔记 事件
2011/11/02 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
在JavaScript中typeof的用途介绍
2013/04/11 Javascript
Extjs4 类的定义和扩展实例
2013/06/28 Javascript
JavaScript也谈内存优化
2014/06/06 Javascript
jQuery实现倒计时按钮功能代码分享
2014/09/03 Javascript
jquery取子节点及当前节点属性值的方法
2014/09/09 Javascript
swtich/if...else的替代语句
2015/08/16 Javascript
属于你的jQuery提示框(Tip)插件
2016/01/20 Javascript
jQuery中的Deferred和promise 的区别
2016/04/03 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
Bootstrap CSS组件之大屏幕展播
2016/12/17 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
Web开发中客户端的跳转与服务器端的跳转的区别
2017/03/05 Javascript
Bootstrap里的文件分别代表什么意思及其引用方法
2017/05/01 Javascript
Angular简单验证功能示例
2017/12/22 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
vue-cli项目中使用echarts图表实例
2018/10/22 Javascript
element-ui点击查看大图的方法示例
2020/12/14 Javascript
[48:31]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第一场 2月2日
2021/03/11 DOTA
Python完全新手教程
2007/02/08 Python
Python Trie树实现字典排序
2014/03/28 Python
在Django的URLconf中进行函数导入的方法
2015/07/18 Python
详解Python map函数及Python map()函数的用法
2017/11/16 Python
Python实现的各种常见分布算法示例
2018/12/13 Python
Python如何重新加载模块
2020/07/29 Python
Python lambda表达式原理及用法解析
2020/08/18 Python
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
党支部综合考察材料
2014/05/19 职场文书
2016全国“质量月”活动标语口号
2015/12/26 职场文书