通过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 相关文章推荐
JQuery UI皮肤定制
Jul 27 Javascript
js怎么判断flash swf文件是否加载完毕
Aug 14 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
May 21 Javascript
浅谈js算法和流程控制
Dec 29 Javascript
基于vue2实现上拉加载功能
Nov 28 Javascript
实例解析ES6 Proxy使用场景介绍
Jan 08 Javascript
Angular如何在应用初始化时运行代码详解
Jun 11 Javascript
node使用Mongoose类库实现简单的增删改查
Nov 08 Javascript
JS实现页面跳转与刷新的方法汇总
Aug 30 Javascript
15分钟学会vue项目改造成SSR(小白教程)
Dec 17 Javascript
js事件机制----捕获与冒泡机制实例分析
May 22 Javascript
原生JS实现记忆翻牌游戏
Jul 31 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
php5数字型字符串加解密代码
2008/04/24 PHP
PHP iconv 解决utf-8和gb2312编码转换问题
2010/04/12 PHP
php radio 单选框获取与保持值的实现代码
2010/05/15 PHP
php类声明和php类使用方法示例分享
2014/03/29 PHP
编写PHP脚本使WordPress的主题支持Widget侧边栏
2015/12/14 PHP
PHP实现的获取文件mimes类型工具类示例
2018/04/08 PHP
javascript实现的在当前窗口中漂浮框的代码
2010/03/15 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
2015/06/26 Javascript
ionic由于使用了header和subheader导致被遮挡的问题的两种解决方法
2016/09/22 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
JavaScript实现汉字转换为拼音的库文件示例
2016/12/22 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
JS生成一维码(条形码)功能示例
2017/01/19 Javascript
自定义事件解决重复请求BUG的问题
2017/07/11 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
2017/09/03 Javascript
浅谈vue+webpack项目调试方法步骤
2017/09/11 Javascript
viewer.js实现图片预览功能
2020/06/24 Javascript
基于JavaScript实现简单的轮播图
2021/03/03 Javascript
[52:39]完美世界DOTA2联赛PWL S3 CPG vs Forest 第一场 12.16
2020/12/17 DOTA
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
2019/05/15 Python
[机器视觉]使用python自动识别验证码详解
2019/05/16 Python
python Pandas库基础分析之时间序列的处理详解
2019/07/13 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
python:删除离群值操作(每一行为一类数据)
2020/06/08 Python
Python字符串格式化常用手段及注意事项
2020/06/17 Python
Foot Locker德国官方网站:美国运动服和鞋类零售商
2018/11/01 全球购物
人力资源经理的岗位职责
2014/03/02 职场文书
大课间体育活动方案
2014/03/12 职场文书
社区交通安全实施方案
2014/03/22 职场文书
成绩单家长评语大全
2014/04/16 职场文书
开学典礼演讲稿
2014/05/23 职场文书
出纳试用期自我评价
2015/03/10 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
2015年建筑工程工作总结
2015/05/13 职场文书