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 处理HTML元素必须避免使用的一种方法
Jul 30 Javascript
让人印象深刻的10个jQuery手风琴效果应用
May 08 Javascript
根据json字符串生成Html的一种方式
Jan 09 Javascript
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
Mar 22 Javascript
javascript history对象(历史记录)使用方法(实现浏览器前进后退)
Jan 07 Javascript
轻松掌握JavaScript状态模式
Sep 07 Javascript
Bootstrap3 内联单选和多选框
Dec 29 Javascript
基于javascript的异步编程实例详解
Apr 10 Javascript
灵活使用console让js调试更简单的方法步骤
Apr 23 Javascript
Vue.js自定义指令学习使用详解
Oct 19 Javascript
JavaScript前后端JSON使用方法教程
Nov 23 Javascript
简单聊聊Vue中的计算属性和属性侦听
Oct 05 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 引用是个坏习惯
2010/03/12 PHP
PHP中最容易忘记的一些知识点总结
2013/04/28 PHP
PHP中读取照片exif信息的方法
2014/08/20 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
幻宇的层模拟窗口效果-提供演示和下载
2007/01/20 Javascript
HTML 自动伸缩的表格Table js实现
2009/04/01 Javascript
js中将URL中的参数提取出来作为对象的实现代码
2011/08/16 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
jQuery插件Validate实现自定义表单验证
2016/01/18 Javascript
js添加事件的通用方法推荐
2016/05/15 Javascript
浅谈JS中String()与 .toString()的区别
2016/10/20 Javascript
docker中编译nodejs并使用nginx启动
2017/06/23 NodeJs
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
2018/03/06 Javascript
在小程序中集成redux/immutable/thunk第三方库的方法
2018/08/12 Javascript
node上的redis调用优化示例详解
2018/10/30 Javascript
M2实现Nodejs项目自动部署的方法步骤
2019/05/05 NodeJs
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
[37:29]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.19
2020/11/19 DOTA
python下paramiko模块实现ssh连接登录Linux服务器
2015/06/03 Python
利用python实现命令行有道词典的方法示例
2017/01/31 Python
教你学会使用Python正则表达式
2017/09/07 Python
linux中如何使用python3获取ip地址
2019/07/15 Python
Django中使用MySQL5.5的教程
2019/12/18 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
Jupyter Notebook安装及使用方法解析
2020/11/12 Python
CSS3系列教程:背景图片(背景大小和多背景图) 应用说明
2012/12/19 HTML / CSS
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
戴尔荷兰官方网站:Dell荷兰
2020/10/04 全球购物
PHP如何自定义函数
2016/09/16 面试题
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
计算机专业毕业生求职信
2014/04/30 职场文书
五四青年节演讲稿
2014/05/26 职场文书
2016入党积极分子心得体会
2016/01/06 职场文书
2016年小学“我们的节日·中秋节”活动总结
2016/04/05 职场文书
Java中try catch处理异常示例
2021/12/06 Java/Android