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 相关文章推荐
niceTitle 基于jquery的超链接提示插件
May 31 Javascript
Firebug入门指南(Firefox浏览器)
Aug 21 Javascript
jQuery Ajax使用 全解析
Dec 15 Javascript
基于jQuery的公告无限循环滚动实现代码
May 11 Javascript
JS使用for循环遍历Table的所有单元格内容
Aug 21 Javascript
基于jQuery的ajax方法封装
Jul 14 Javascript
更靠谱的H5横竖屏检测方法(js代码)
Sep 13 Javascript
ligerUI---ListBox(列表框可移动的实例)
Nov 28 Javascript
JavaScript callback回调函数用法实例分析
May 08 Javascript
vue生命周期实例小结
Aug 15 Javascript
webpack+vue-cli项目中引入外部非模块格式js的方法
Sep 28 Javascript
JavaScript对象原型链原理解析
Jan 22 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 VS ASP
2006/10/09 PHP
杏林同学录(五)
2006/10/09 PHP
简化php模板页面中分页代码的解析
2009/02/06 PHP
php自动给文章加关键词链接的函数代码
2012/11/29 PHP
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
基于jQuery的ajax功能实现web service的json转化
2009/08/29 Javascript
Javascript 定时器调用传递参数的方法
2009/11/12 Javascript
jquery构造器的实现代码小结
2011/05/16 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
深入理解Javascript里的依赖注入
2014/03/19 Javascript
浅谈JavaScript函数节流
2014/12/09 Javascript
JavaScript日期时间与时间戳的转换函数分享
2015/01/31 Javascript
JS/Jquery判断对象为空的方法
2015/06/11 Javascript
Node.js的环境安装配置(使用nvm方式)
2016/10/11 Javascript
详解用node.js实现简单的反向代理
2017/06/26 Javascript
webpack 模块热替换原理
2018/04/09 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
详解vue-cli3多页应用改造
2019/06/04 Javascript
微信内置浏览器图片查看器的代码实例
2019/10/08 Javascript
原生js实现自定义滚动条
2021/01/20 Javascript
[20:30]职业巡回赛回顾
2018/08/09 DOTA
Python本地与全局命名空间用法实例
2015/06/16 Python
python中利用Future对象回调别的函数示例代码
2017/09/07 Python
python实现学生管理系统
2018/01/11 Python
centos 安装Python3 及对应的pip教程详解
2019/06/28 Python
pandas dataframe 中的explode函数用法详解
2020/05/18 Python
美体小铺波兰官方网站:The Body Shop波兰
2019/09/03 全球购物
单位人事专员介绍信
2014/01/11 职场文书
机械个人求职信范文
2014/01/24 职场文书
石油大学毕业生自荐信
2014/01/28 职场文书
七匹狼男装广告词
2014/03/21 职场文书
优秀党支部书记事迹材料
2014/05/29 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
2015年教研工作总结
2015/05/23 职场文书
mysql查看表结构的三种方法总结
2022/07/07 MySQL
nginx静态资源的服务器配置方法
2022/07/07 Servers