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 相关文章推荐
editable.js 基于jquery的表格的编辑插件
Oct 24 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
Aug 24 Javascript
jQuery无刷新分页完整实例代码
Oct 27 Javascript
纯JS代码实现气泡效果
May 04 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
Sep 05 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
Apr 21 Javascript
微信小程序实现缓存根据不同的id来进行设置和读取缓存
Jun 12 Javascript
微信小程序websocket实现聊天功能
Mar 30 Javascript
对vue中methods互相调用的方法详解
Aug 30 Javascript
使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
Oct 23 Javascript
简单分析js中的this的原理
Aug 31 Javascript
小程序登录之支付宝授权的实现示例
Dec 13 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中定义网站根目录的常用方法
2010/08/08 PHP
destoon设置自定义搜索的方法
2014/06/21 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
深入解析PHP底层机制及相关原理
2020/12/11 PHP
jquery select(列表)的操作(取值/赋值)
2011/03/16 Javascript
Jquery index()方法 获取相应元素索引值
2012/10/12 Javascript
JS 实现点击a标签的时候让其背景更换
2013/10/15 Javascript
jQuery实现带动画效果的二级下拉导航方法
2015/03/11 Javascript
用户代理字符串userAgent可实现的四个识别
2015/09/20 Javascript
Java Mybatis框架入门基础教程
2015/09/21 Javascript
JS加载iFrame出现空白问题的解决办法
2016/05/13 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
JS数组操作中的经典算法实例讲解
2017/07/26 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
详解关闭令人抓狂的ESlint 语法检测配置方法
2019/10/28 Javascript
解决vue单页面多个组件嵌套监听浏览器窗口变化问题
2020/07/30 Javascript
一起深入理解js中的事件对象
2021/02/06 Javascript
python操作ie登陆土豆网的方法
2015/05/09 Python
解决python selenium3启动不了firefox的问题
2018/10/13 Python
基于python指定包的安装路径方法
2018/10/27 Python
python3学生名片管理v2.0版
2018/11/29 Python
使用python模拟高斯分布例子
2019/12/09 Python
利用Python将多张图片合成视频的实现
2020/11/23 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
css3实现波纹特效、H5实现动态波浪效果
2018/01/31 HTML / CSS
css3media响应式布局实例
2016/07/08 HTML / CSS
金融专业毕业生推荐信
2013/11/26 职场文书
网络书店创业计划书
2014/02/07 职场文书
法定代表人授权委托书范文
2014/08/02 职场文书
春节超市活动方案
2014/08/14 职场文书
思想作风纪律整顿心得体会
2014/09/04 职场文书
公务员四风问题对照检查材料整改措施
2014/09/26 职场文书
商务司机岗位职责
2015/04/10 职场文书
导游词之黄果树瀑布
2019/09/20 职场文书
Python中的套接字编程是什么?
2021/06/21 Python