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 相关文章推荐
通过MSXML2自动获取QQ个人头像及在线情况(给初学者)
Jan 22 Javascript
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
Feb 26 Javascript
javaScript中push函数用法实例分析
Jun 08 Javascript
JavaScript保留关键字汇总
Dec 01 Javascript
JS获取多维数组中相同键的值实现方法示例
Jan 06 Javascript
Vue.js实现输入框绑定的实例代码
Aug 24 Javascript
Vue仿手机qq的实例代码(demo)
Sep 08 Javascript
electron demo项目npm install安装失败的解决方法
Feb 06 Javascript
解决vue-cli webpack打包后加载资源的路径问题
Sep 25 Javascript
详解vue如何使用rules对表单字段进行校验
Oct 17 Javascript
vue导航栏部分的动态渲染实例
Nov 01 Javascript
Node.js API详解之 Error模块用法实例分析
May 14 Javascript
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初学者们头痛的十四个问题
2007/01/15 PHP
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
PHP程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
MySQL时间字段究竟使用INT还是DateTime的说明
2012/02/27 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
PHP连接和操作MySQL数据库基础教程
2014/09/29 PHP
PHP面向对象精要总结
2014/11/07 PHP
浅谈PHP无限极分类原理
2019/03/14 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
2019/04/27 PHP
javascript innerHTML使用分析
2010/12/03 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
JavaScript通过字符串调用函数的实现方法
2015/03/18 Javascript
JavaScript手机振动API
2016/06/11 Javascript
浅谈jQuery双事件多重加载的问题
2016/10/05 Javascript
nodejs实现截取上传视频中一帧作为预览图片
2017/12/10 NodeJs
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
vue实现的组件兄弟间通信功能示例
2018/12/04 Javascript
微信小程序学习笔记之目录结构、基本配置图文详解
2019/03/28 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
2019/06/18 Javascript
Python RuntimeError: thread.__init__() not called解决方法
2015/04/28 Python
基于Python获取docx/doc文件内容代码解析
2020/02/17 Python
基于Pyinstaller打包Python程序并压缩文件大小
2020/05/28 Python
纯CSS3代码实现文字描边
2016/04/25 HTML / CSS
美国眼镜网:GlassesUSA
2017/09/07 全球购物
全球性的女装店:storets
2019/06/12 全球购物
澳大利亚顶级美发和美容贸易超市:glamaCo
2020/01/19 全球购物
一套Java笔试题
2016/08/20 面试题
应届生财务会计求职信
2013/11/05 职场文书
一年级家长会邀请函
2014/01/25 职场文书
家长建议怎么写
2014/05/15 职场文书
超市创意活动方案
2014/08/15 职场文书
2015年新农合工作总结
2015/03/30 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
体育教师教学随笔
2015/08/15 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书
SQL实现LeetCode(178.分数排行)
2021/08/04 MySQL