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的Repeater实现代码
Jul 17 Javascript
ajax不执行success回调而是执行了error回调
Dec 10 Javascript
JS 仿腾讯发表微博的效果代码
Dec 25 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
Jan 17 Javascript
一个获取第n个元素节点的js函数
Sep 02 Javascript
JavaScrip常见的一些算法总结
Dec 28 Javascript
Node.js程序中的本地文件操作用法小结
Mar 06 Javascript
xtemplate node.js 的使用方法实例解析
Aug 22 Javascript
使用Vue完成一个简单的todolist的方法
Dec 01 Javascript
利用Node.js如何实现文件循环覆写
Apr 05 Javascript
详解微信小程序-canvas绘制文字实现自动换行
Apr 26 Javascript
详解Vue中的自定义指令
Dec 07 Vue.js
基于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分页显示制作详细讲解
2008/11/19 PHP
php使浏览器直接下载pdf文件的方法
2013/11/15 PHP
PHP 读取大文件并显示的简单实例(推荐)
2016/08/12 PHP
用PHP的反射实现委托模式的讲解
2019/03/22 PHP
传智播客学习之java 反射
2009/11/22 Javascript
js 与或运算符 || && 妙用
2009/12/09 Javascript
jquery中加载图片自适应大小主要实现代码
2013/08/23 Javascript
javascript中使用正则表达式清理table样式的代码
2020/04/01 Javascript
JS实现屏蔽网页右键复制及ctrl+c复制的方法【2种方法】
2016/09/04 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
关于JavaScript中forEach和each用法浅析
2017/07/27 Javascript
JavaScript实现图片切换效果
2017/08/12 Javascript
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
jQuery 获取除某指定对象外的其他对象 ( :not() 与.not())
2018/10/10 jQuery
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
微信小程序实现录音时的麦克风动画效果实例
2019/05/18 Javascript
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
Python datetime时间格式化去掉前导0
2014/07/31 Python
Python中暂存上传图片的方法
2015/02/18 Python
python使用wxPython打开并播放wav文件的方法
2015/04/24 Python
Django数据库表反向生成实例解析
2018/02/06 Python
matplotlib 纵坐标轴显示数据值的实例
2018/05/25 Python
Pandas之Dropna滤除缺失数据的实现方法
2019/06/25 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
美国时装品牌:Nautica(诺帝卡)
2016/08/28 全球购物
Charlotte Tilbury美国官网:英国美妆品牌
2017/10/13 全球购物
描述内存分配方式以及它们的区别
2016/10/15 面试题
总经理岗位职责
2013/11/09 职场文书
列车长先进事迹材料
2014/01/25 职场文书
个人典型事迹材料
2014/12/30 职场文书
小爸爸观后感
2015/06/15 职场文书
2016班级元旦联欢会开幕词
2016/03/04 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript
python四种出行路线规划的实现
2021/06/23 Python