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 相关文章推荐
学习ExtJS Window常用方法
Oct 07 Javascript
JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
Feb 25 Javascript
jQuery Tools tooltip使用说明
Jul 14 Javascript
js实现的类似于asp数据字典的数据类型代码实例
Sep 03 Javascript
javascript实现判断鼠标的状态
Jul 10 Javascript
Jquery Mobile 自定义按钮图标
Nov 18 Javascript
Vue实现选择城市功能
May 27 Javascript
vue生成随机验证码的示例代码
Sep 29 Javascript
浅谈Webpack下多环境配置的思路
Jun 27 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
Nov 13 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
Sep 10 Javascript
基于JS实现计算24点算法代码实例解析
Jul 23 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实现指定字段的多维数组排序函数分享
2015/03/09 PHP
PHP基于phpqrcode生成带LOGO图像的二维码实例
2015/07/10 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
2019/07/18 PHP
javascript脚本编程解决考试分数统计问题
2008/10/18 Javascript
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
js 删除数组的几种方法小结
2014/02/21 Javascript
jquery 实现input输入什么div图层显示什么
2014/06/15 Javascript
JavaScript的ExtJS框架中表格的编写教程
2016/05/21 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
2016/09/05 Javascript
谈谈对JavaScript原生拖放的深入理解
2016/09/20 Javascript
jquery+css3问卷答题卡翻页动画效果示例
2016/10/26 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
2017/03/06 Javascript
vue如何获取点击事件源的方法
2017/08/10 Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
2018/08/03 jQuery
vue js秒转天数小时分钟秒的实例代码
2018/08/08 Javascript
vue组件数据传递、父子组件数据获取,slot,router路由功能示例
2019/03/19 Javascript
Vue前端项目部署IIS的实现
2020/01/06 Javascript
npx create-react-app xxx创建项目报错的解决办法
2020/02/17 Javascript
nuxt静态部署打包相对路径操作
2020/11/06 Javascript
[47:04]EG vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
浅析python继承与多重继承
2018/09/13 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
2019/04/28 Python
分享8个非常流行的 Python 可视化工具包
2019/06/05 Python
python列表推导和生成器表达式知识点总结
2020/01/10 Python
python线程池 ThreadPoolExecutor 的用法示例
2020/10/10 Python
阿里健康大药房:阿里自营网上药店
2017/08/01 全球购物
Java程序员综合测试题
2014/04/25 面试题
旅游安全协议书
2014/04/21 职场文书
班级口号大全
2014/06/09 职场文书
2014年个人思想工作总结
2014/11/27 职场文书
小学班主任自我评价
2015/03/11 职场文书
元旦晚会主持词开场白
2015/05/28 职场文书
学前教育见习总结
2015/06/23 职场文书
mybatis使用oracle进行添加数据的方法
2021/04/27 Oracle
使用numpy nonzero 找出非0元素
2021/05/14 Python