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在线html(富文本,所见即所得)编辑器
Dec 18 Javascript
jQuery中对节点进行操作的相关介绍
Apr 16 Javascript
jQuery控制元素显示、隐藏、切换、滑动的方法总结
Apr 16 Javascript
Web开发必知Javascript技巧大全
Feb 23 Javascript
Google 地图获取API Key详细教程
Aug 06 Javascript
jQuery 移动端拖拽(模块化开发,触摸事件,webpack)
Oct 28 Javascript
jQuery实现字符串全部替换的方法【推荐】
Mar 09 Javascript
node.js 中间件express-session使用详解
May 20 Javascript
jquery实现侧边栏左右伸缩效果的示例
Dec 19 jQuery
vue代理和跨域问题的解决
Jul 18 Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
Jan 30 Javascript
ESLint 是如何检查 .vue 文件的
Nov 30 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读取数据库并按照中文名称进行排序实现代码
2013/01/29 PHP
PHP大小写问题:函数名和类名不区分,变量名区分
2013/06/17 PHP
PHP生成自适应大小的缩略图类及使用方法分享
2014/05/06 PHP
javascript十个最常用的自定义函数(中文版)
2009/09/07 Javascript
点击进行复制的JS代码实例
2013/08/23 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
JavaScript实现按Ctrl键打开新页面
2014/09/04 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
Javascript中级语法快速入手
2016/07/30 Javascript
JS简单实现移动端日历功能示例
2016/12/28 Javascript
Easyui Datagrid自定义按钮列(最后面的操作列)
2017/07/13 Javascript
JavaScript实现旋转轮播图
2020/08/18 Javascript
jquery一键控制checkbox全选、反选或全不选
2017/10/16 jQuery
详解基于vue-cli配置移动端自适应
2018/01/13 Javascript
基于vue实现web端超大数据量表格的卡顿解决
2019/04/02 Javascript
Vue的click事件防抖和节流处理详解
2019/11/13 Javascript
javascript实现滚动条效果
2020/03/24 Javascript
jQuery 选择方法及$(this)用法实例分析
2020/05/19 jQuery
python缩进区别分析
2014/02/15 Python
Python文件操作类操作实例详解
2014/07/11 Python
简单介绍Python下自己编写web框架的一些要点
2015/04/29 Python
简述Python中的进程、线程、协程
2016/03/18 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
python3注册全局热键的实现
2020/03/22 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
2021/01/05 Python
德国电子产品购物网站:TechInTheBasket德国
2018/12/07 全球购物
c语言常见笔试题总结
2016/09/05 面试题
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/04/11 面试题
物理系毕业生自荐信
2013/11/01 职场文书
毕业生实习期转正自我鉴定
2014/09/26 职场文书
2014年村支部书记四风对照检查材料思想汇报
2014/10/02 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
党风廉洁教育心得体会
2016/01/20 职场文书
2019年大学生学年自我鉴定!
2019/03/25 职场文书
2019年中,最受大众欢迎的6本新书
2019/08/07 职场文书
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers