通过vue手动封装on、emit、off的代码详解


Posted in Javascript onMay 29, 2019

一、概念

1. $on("事件名称",回调函数)

事件绑定,一个事件名称上面可能绑定多个函数

2. $emit("事件名称",需要传递的值)

事件触发时,会触发当前事件身上所有的函数

3. $off("事件名称",[需要解绑的函数])

事件解绑时,若指定解绑函数则只解绑相应函数,否则解绑全部

二、手动封装on,emit,off事件在vue中的作用

|  在vue中进行非父子组件传值时,我们可以通过在vue的原型上添加一个公共的vue实例,组件之间调用这个公共实例的$on/$emit来传递数据,传递的一方调用$emit,接收的一方调用$on。

Vue.prototype.Observer = new Vue();  //实例化对象

|  这种方式能使所有对象拥有共同的on和emit,但是增加的属性所挂载的实例对象太大,就相当于你的一台法拉利的轮子坏了,你又买了一台新的法拉利并卸掉它的轮子,放到了原来的法拉利上,这十分耗费性能。因此,我们可以手动封装事件,来实现非父子传值。

import Observer from "./Observer"; //引入封装好的文件
Vue.prototype.Observer = Observer;  //将其添加到vue的原型上

三、封装on,emit,off事件

1. $on:创建一个事件仓库存放事件,判断事件名称是否存在。若不存在,初始化创建一个数组;若存在,将当前函数push到数组中。

const EventList = {}; //一个事件名称上面可能绑定多个函数,因此是一对多的模式,即观察者模式,数据类型采用对象
const on = function(eventName,callback){
  if(!EventList[eventName]){
    EventList[eventName] = [];
  }

  EventList[eventName].push(callback);
}

2. $emit:判断事件名称是否存在。若不存在,直接返回return;若存在,对当前事件名称所对应的所有函数进行遍历,并将参数传递过去。

const emit = function(eventName,params){
  if(!EventList[eventName])return;

  EventList[eventName].map((cb)=>{
    cb(params)
  })
}

3. $off:判断事件名称是否存在。若不存在,直接返回return;若存在,判断callback是否存在,如果存在则删除对应下标的的函数,如果不存在则将当前数组清空。

const off = function(eventName,callback){
  if(!EventList[eventName])return;

  if(callback){
    let index = EventList[eventName].indexOf(callback);
    EventList[eventName].splice(index,1);
  }else{
    EventList[eventName] = [];
  }
}

4. 导出:便于在其他文件中调用。

export default {
  $on : on,
  $emit : emit,
  $off : off
}

总结

以上所述是小编给大家介绍的通过vue手动封装on、emit、off的代码详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
javascript打开新窗口同时关闭旧窗口
Jan 16 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
Aug 12 Javascript
Jquery上传插件 uploadify v3.1使用说明
Jun 18 Javascript
js页面跳转的问题(跳转到父页面、最外层页面、本页面)
Aug 14 Javascript
js弹出对话框方式小结
Nov 17 Javascript
JavaScript实现相册弹窗功能(zepto.js)
Jun 21 Javascript
微信小程序 聊天室简单实现
Apr 19 Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
Dec 27 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
Sep 30 Javascript
vue+导航锚点联动-滚动监听和点击平滑滚动跳转实例
Nov 13 Javascript
详解element-ui动态限定的日期范围选择器代码片段
Jul 03 Javascript
详解JavaScript中的this指向问题
Feb 05 Javascript
el-select数据过多懒加载的解决(loadmore)
May 29 #Javascript
JS学习笔记之原型链和利用原型实现继承详解
May 29 #Javascript
vue读取本地的excel文件并显示在网页上方法示例
May 29 #Javascript
vue-cli3中vue.config.js配置教程详解
May 29 #Javascript
详解vue-cli3开发Chrome插件实践
May 29 #Javascript
vue里的data要用return返回的原因浅析
May 28 #Javascript
Vue+Element实现表格编辑、删除、以及新增行的最优方法
May 28 #Javascript
You might like
discuz7 phpMysql操作类
2009/06/21 PHP
PHP If Else(elsefi) 语句
2013/04/07 PHP
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
2013/06/03 PHP
安装apache2.2.22配置php5.4(具体操作步骤)
2013/06/26 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
浅析PHP7 的垃圾回收机制
2019/09/06 PHP
Laravel 数据库加密及数据库表前缀配置方法
2019/10/10 PHP
Jquery AutoComplete自动完成 的使用方法实例
2010/03/19 Javascript
jQuery 源码分析笔记(5) jQuery.support
2011/06/19 Javascript
jQuery表单美化插件jqTransform使用详解
2015/04/12 Javascript
JQuery中两个ul标签的li互相移动实现方法
2015/05/18 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
2015/06/29 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
Bootstrap被封装的弹层
2016/07/20 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
ECMAScript6变量的解构赋值实例详解
2017/09/19 Javascript
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
element-ui 表格实现单元格可编辑的示例
2018/02/26 Javascript
Express结合Webpack的全栈自动刷新
2019/05/23 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
2019/05/30 jQuery
[04:04]显微镜下的DOTA2第六期——电影级别的华丽团战
2014/06/20 DOTA
详解Django之auth模块(用户认证)
2018/04/17 Python
pandas 选择某几列的方法
2018/07/03 Python
python爬虫获取百度首页内容教学
2018/12/23 Python
在Python 中同一个类两个函数间变量的调用方法
2019/01/31 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
python使用scapy模块实现ARP扫描的过程
2021/01/21 Python
智乐游戏测试笔试题
2014/05/21 面试题
应届毕业生自我评价分享
2013/12/15 职场文书
最新茶叶店创业计划书
2014/01/14 职场文书
荷叶圆圆教学反思
2014/02/01 职场文书
班干部竞选演讲稿
2014/04/24 职场文书
工资证明格式模板
2015/06/12 职场文书
2016党员干部政治学习心得体会
2016/01/23 职场文书
浅谈什么是SpringBoot异常处理自动配置的原理
2021/06/21 Java/Android