Vue2.0 事件的广播与接收(观察者模式)


Posted in Javascript onMarch 14, 2018

1.Vue1.0 事件的广播与接收(观察者模式)

早期vue1.0组件之间的这通信传递数据的方法,vue官网给出了两上方法 $dispatch 和 $broadcast。

但vue2.0之后就弃用 这两个方法,以下原因是vue官网给出来的

Vue2.0 事件的广播与接收(观察者模式)

官方文档

2.Vue2.0 事件的广播与接收(观察者模式)

vue2.0中可以使用 $emit, $on, $off 分别来分发、监听、取消监听事件。官方的给出的最简单的升级建议是使用集中的事件处理器,而且也明确说明了 一个空的vue实例就可以做到,因为Vue 实例实现了一个事件分发接口.

请直接看代码,在初始化的时候,在全局App.vue文件中给data添加一个 名字为eventhub 的空vue对象:

new Vue({
 el: '#app',
 router,
 render: h => h(App),
 data: {
  eventHub: new Vue()
 }
})

这样我们就可以在任何组件都可以调用事件发射接收的方法了.那么在组件是如何发射与接收的呢?请看正面代码 :

某一个组件内调用事件触发

//通过this.$root.eventHub获取此对象
//调用$emit 方法
this.$root.eventHub.$emit('你的事件名字', 你的需要传送的数据)

以上就是一个组件发射了一个事件 ,可以理解成我发送了一个广播,如果其它组件有需要我的广播,那么请调整到我的频道,这个频道就是你的事件名字,而广播的内容就是你传送的数据,那么问题了,其它组件是用什么方法来接收呢?请看代码

this.$root.eventHub.$on('你的事件名字', (传送的数据)=>{
  handle(yourData)
} )

需要收听广播的组件可以通过我们全局定义的eventHub.$on来接收,接收频道就是广播的事件名字,回调里面有数就是广播内容。

3.更加简洁的写好

对js有一定的了解,可能知道js有一个prototype的东西,这个主要的给js对象增加额外的属性。

比如 声明一个对象

var person=function(){
  this.name="小明";
}

然后我们扩展一下这个对象,比如增加一个讲话的方法,这时prototype这个好用的东西就派上用场了

person.prototype.say=function(){
  alert(this.name);
}

这样就扩展了原来的函数对象了

调用的时候直接

var a=new person();

person.say();就会弹出小明来了。这么做的好处是不会额外产生内存,所有实例化后的对象都会从原型上继承这个方法。

Vue其实就是js一个类库,当然也可以用prototype这个神奇的东西来拓展自定义的属性了,看招:

在初始化Vue.app 之前 加上这样一句:

Vue.prototype.$eventHub= Vue.prototype.$eventHub || new Vue()

这样我们在组件内部 就可以直接调用$eventHub

以下是对上面的方法重新 改造:

发布者

//通过this.$root.eventHub获取此对象
//调用$emit 方法
this.$eventHub.$emit('你的事件名字', 你的需要传送的数据)

接收者

this.$eventHub.$on('你的事件名字', (传送)=>{
    handle(yourData).
  } )

4.关闭广播

关闭广播我们主要通过 $off(你的事件名字)来取消收听就可以啦!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js textarea自动增高并隐藏滚动条
Dec 16 Javascript
jquery插件corner实现圆角边框的方法
Mar 09 Javascript
js+css实现上下翻页相册代码分享
Aug 18 Javascript
javascript中for/in循环及使用技巧
Sep 01 Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
Jun 13 Javascript
理解 Node.js 事件驱动机制的原理
Aug 16 Javascript
jquery实现用户登陆界面(示例讲解)
Sep 06 jQuery
详解React native全局变量的使用(跨组件的通信)
Sep 07 Javascript
Express本地测试HTTPS的示例代码
Jun 06 Javascript
webpack自动打包和热更新的实现方法
Jun 24 Javascript
微信小程序image图片加载完成监听
Aug 31 Javascript
Vue+Bootstrap实现简易学生管理系统
Feb 09 Vue.js
vue项目国际化vue-i18n的安装使用教程
Mar 14 #Javascript
Vue使用mixins实现压缩图片代码
Mar 14 #Javascript
vue2.0模拟锚点的实例
Mar 14 #Javascript
vue的mixins属性详解
Mar 14 #Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
Mar 14 #Javascript
react中fetch之cors跨域请求的实现方法
Mar 14 #Javascript
解决vue项目报错webpackJsonp is not defined问题
Mar 14 #Javascript
You might like
超小PHP小马小结(方便查找后门的朋友)
2012/05/05 PHP
PHP register_shutdown_function函数的深入解析
2013/06/03 PHP
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
JS+CSS实现模仿浏览器网页字符查找功能的方法
2015/02/26 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
2015/07/31 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
text-align:justify实现文本两端对齐 兼容IE
2015/08/19 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
JS+CSS实现仿支付宝菜单选中效果代码
2015/09/25 Javascript
vue.js表格分页示例
2016/10/18 Javascript
js获取浏览器和屏幕的各种宽度高度
2017/02/22 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
2017/02/23 Javascript
jQuery之动画ajax事件(实例讲解)
2017/07/18 jQuery
Node.js 的模块知识汇总
2017/08/16 Javascript
Vuejs实现购物车功能
2017/11/05 Javascript
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
2019/09/27 Javascript
nodejs dgram模块广播+组播的实现示例
2019/11/04 NodeJs
[40:03]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
django主动抛出403异常的方法详解
2019/01/04 Python
Python基于mysql实现学生管理系统
2019/02/21 Python
pytorch 求网络模型参数实例
2019/12/30 Python
python保留小数位的三种实现方法
2020/01/07 Python
Django调用支付宝接口代码实例详解
2020/04/04 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
CSS3 仿微信聊天小气泡实例代码
2017/04/05 HTML / CSS
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
物业客服专员岗位职责
2013/11/30 职场文书
幼儿园运动会加油词
2014/02/14 职场文书
2014年创卫实施方案
2014/02/18 职场文书
材料员岗位职责
2014/03/13 职场文书
保护动物的标语
2014/06/11 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书
mysql配置SSL证书登录的实现
2021/09/04 MySQL