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 相关文章推荐
在JavaScript中通过URL传递汉字的方法
Apr 09 Javascript
用dom+xhtml+css制作的一个相册效果代码打包下载
Jan 24 Javascript
javascript 密码强弱度检测万能插件
Feb 25 Javascript
学习JS面向对象成果 借国庆发布个最新作品与大家交流
Oct 03 Javascript
location.href 在IE6中不跳转的解决方法与推荐使用代码
Jul 08 Javascript
利用JQuery的load函数动态加载其它页面的内容的实现代码
Dec 14 Javascript
js Dialog 去掉右上角的X关闭功能
Apr 23 Javascript
教你如何使用PHP输出中文JSON字符串
May 22 Javascript
Bootstrap响应式表格详解
May 23 Javascript
微信小程序开发之toast等弹框提示使用教程
Jun 08 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
Dec 23 Javascript
Vue源码解读之Component组件注册的实现
Aug 24 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
深入for,while,foreach遍历时间比较的详解
2013/06/08 PHP
解析数组非数字键名引号的必要性
2013/08/09 PHP
function, new function, new Function之间的区别
2007/03/08 Javascript
基于Jquery的淡入淡出的特效基础练习
2010/12/13 Javascript
关于锚点跳转及jQuery下相关操作与插件
2012/10/01 Javascript
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
60个很实用的jQuery代码开发技巧收集
2014/12/15 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
JavaScript学习笔记之数组的增、删、改、查
2016/03/23 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
webpack学习笔记之代码分割和按需加载的实例详解
2017/07/20 Javascript
PHP自动加载autoload和命名空间的应用小结
2017/12/01 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
vue-cli安装使用流程步骤详解
2018/11/08 Javascript
vue单页面在微信下只能分享落地页的解决方案
2019/04/15 Javascript
webpack HappyPack实战详解
2019/10/08 Javascript
Vue列表循环从指定下标开始的多种解决方案
2020/04/08 Javascript
微信小程序自定义扫码功能界面的实现代码
2020/07/02 Javascript
如何检测JavaScript中的死循环示例详解
2020/08/30 Javascript
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
Python模块学习 re 正则表达式
2011/05/19 Python
python 实现堆排序算法代码
2012/06/05 Python
九步学会Python装饰器
2015/05/09 Python
Python基于pandas实现json格式转换成dataframe的方法
2018/06/22 Python
Python Django实现layui风格+django分页功能的例子
2019/08/29 Python
魔声耳机官方网站:Monster是世界第一品牌的高性能耳机
2016/10/26 全球购物
实习护士自我鉴定
2013/10/13 职场文书
应聘面试自我评价
2014/01/24 职场文书
弘扬雷锋精神活动演讲稿
2014/03/04 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
Python字典和列表性能之间的比较
2021/06/07 Python
Python中文纠错的简单实现
2021/07/07 Python
前端vue+express实现文件的上传下载示例
2022/02/18 Vue.js
详解Spring Security如何在权限中使用通配符
2022/06/28 Java/Android