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 相关文章推荐
jquery.ui.draggable中文文档
Nov 24 Javascript
node.js使用require()函数加载模块
Nov 26 Javascript
jQuery中odd选择器的定义和用法
Dec 23 Javascript
jQuery中element选择器用法实例
Dec 29 Javascript
jQuery对指定元素中指定字符串进行替换的方法
Mar 17 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
Oct 25 Javascript
jQuery根据ID、CLASS、等获取对象的实例
Dec 04 Javascript
JavaScript中this的用法及this在不同应用场景的作用解析
Apr 13 Javascript
angularjs实现table增加tr的方法
Feb 27 Javascript
实用Javascript调试技巧分享(小结)
Jun 18 Javascript
jQuery实现滑动星星评分效果(每日分享)
Nov 13 jQuery
js实现上传图片到服务器
Apr 11 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与浏览器缓存的分析
2013/06/03 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
2014/03/28 PHP
ThinkPHP之N方法实例详解
2014/06/20 PHP
PHP下的浮点运算不准的解决方法
2016/10/27 PHP
潜说js对象和数组
2011/05/25 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
Extjs NumberField后面加单位实现思路
2013/07/30 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
Node.js中对通用模块的封装方法
2014/06/06 Javascript
NodeJS中利用Promise来封装异步函数
2015/02/25 NodeJs
JS实现前端页面的搜索功能
2018/06/12 Javascript
手挽手带你学React之React-router4.x的使用
2019/02/14 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
2019/05/08 Javascript
Layui Table js 模拟选中checkbox的例子
2019/09/03 Javascript
关于vue表单提交防双/多击的例子
2019/10/31 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
vue 动态组件用法示例小结
2020/03/06 Javascript
JS实现简单打字测试
2020/06/24 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
2020/09/07 Javascript
利用Psyco提升Python运行速度
2014/12/24 Python
Python 如何访问外围作用域中的变量
2016/09/11 Python
利用 python 对目录下的文件进行过滤删除
2017/12/27 Python
python测试mysql写入性能完整实例
2018/01/18 Python
python统计多维数组的行数和列数实例
2018/06/23 Python
对python 生成拼接xml报文的示例详解
2018/12/28 Python
python 实现单通道转3通道
2019/12/03 Python
python使用SQLAlchemy操作MySQL
2020/01/02 Python
Python新手学习装饰器
2020/06/04 Python
keras导入weights方式
2020/06/12 Python
面向新手解析python Beautiful Soup基本用法
2020/07/11 Python
教师业务学习制度
2014/01/25 职场文书
《我的第一本书》教学反思
2014/02/15 职场文书
师德师风自我剖析材料
2014/09/27 职场文书
整改报告怎么写
2014/11/06 职场文书
Python进阶学习之带你探寻Python类的鼻祖-元类
2021/05/08 Python