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 防止表单重复提交代码
Jan 21 Javascript
JavaScript判断窗口是否最小化的代码(跨浏览器)
Aug 01 Javascript
在JavaScript中获取请求的URL参数[正则]
Dec 25 Javascript
JS解析json数据并将json字符串转化为数组的实现方法
Dec 25 Javascript
jQuery中get()方法用法实例
Dec 27 Javascript
js鼠标点击图片切换效果实现代码
Nov 19 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
Mar 03 Javascript
Vuejs开发环境搭建及热更新【推荐】
Sep 07 Javascript
vue.draggable实现表格拖拽排序效果
Dec 01 Javascript
TypeScript中的方法重载详解
Apr 12 Javascript
微信小程序实现动态列表项的顺序加载动画
Jul 25 Javascript
原生js实现贪食蛇小游戏的思路详解
Nov 26 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,js双版本
2012/09/25 PHP
PHP闭包(Closure)使用详解
2013/05/02 PHP
PHP限制HTML内容中图片必须是本站的方法
2015/06/16 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
2019/06/14 PHP
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
2010/03/11 Javascript
购物车选中得到价格实现示例
2014/01/26 Javascript
JS的数组迭代方法
2015/02/05 Javascript
JavaScript获取浏览器信息的方法
2015/11/20 Javascript
js实现(全选)多选按钮的方法【附实例】
2016/03/30 Javascript
学习vue.js表单控件绑定操作
2016/12/05 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
Node中使用ES6语法的基础教程
2018/01/05 Javascript
解决vue 绑定对象内点击事件失效问题
2018/09/05 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
python常见数制转换实例分析
2015/05/09 Python
十个Python程序员易犯的错误
2015/12/15 Python
django框架模板中定义变量(set variable in django template)的方法分析
2019/06/24 Python
Python3实现汉语转换为汉语拼音
2019/07/08 Python
基于python plotly交互式图表大全
2019/12/07 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
Python自动重新加载模块详解(autoreload module)
2020/04/01 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
安纳塔拉酒店度假村及水疗官方网站:Anantara Hotel
2016/08/25 全球购物
ABOUT YOU匈牙利:500个最受欢迎的时尚品牌
2019/07/19 全球购物
迪士尼英国官方商店:shopDisney UK
2019/09/21 全球购物
Street One瑞士:德国现代时装公司
2019/10/09 全球购物
如何高效率的查找一个月以内的数据
2012/04/15 面试题
升职自荐信范文
2013/10/05 职场文书
仓管员岗位职责范文
2013/11/08 职场文书
QQ空间主人寄语大全
2014/04/12 职场文书
《长城和运河》教学反思
2014/04/14 职场文书
舞蹈教育学专业求职信
2014/06/29 职场文书
钱学森电影观后感
2015/06/04 职场文书
广播体操比赛主持词
2015/06/29 职场文书
python利用while求100内的整数和方式
2021/11/07 Python