通过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面向对象编程
Nov 15 Javascript
jQuery 借助插件Lavalamp实现导航条动态美化效果
Sep 27 Javascript
coffeescript使用的方式汇总
Aug 05 Javascript
探究Javascript模板引擎mustache.js使用方法
Jan 26 Javascript
修改Jquery Dialog 位置的实现方法
Aug 26 Javascript
基于jQuery实现表格的排序
Dec 02 Javascript
EasyUI折叠表格层次显示detailview详解及实例
Dec 28 Javascript
DOM事件探秘篇
Feb 15 Javascript
13 个npm 快速开发技巧(推荐)
Jul 04 Javascript
Vue实现按钮级权限方案
Nov 21 Javascript
vue 移动端记录页面浏览位置的方法
Mar 11 Javascript
vue点击标签切换选中及互相排斥操作
Jul 17 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
检查url链接是否已经有参数的php代码 添加 ? 或 &
2010/02/09 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
2014/08/06 PHP
如何让搜索引擎抓取AJAX内容解决方案
2014/08/25 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
2014/11/24 PHP
浅谈php7的重大新特性
2015/10/23 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
PHP-FPM实现性能优化
2016/03/31 PHP
LAMP环境使用Composer安装Laravel的方法
2017/03/25 PHP
laravel自定义分页效果
2017/07/23 PHP
Javascript解析URL方法详解
2014/12/05 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
如何用js实现鼠标向上滚动时浮动导航
2016/07/18 Javascript
js 自带的sort() 方法全面了解
2016/08/16 Javascript
jQuery纵向导航菜单效果实现方法
2016/12/19 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
AngularJS 支付倒计时功能实现思路
2017/06/05 Javascript
10个经典的网页鼠标特效代码
2018/01/09 Javascript
什么时候不能在 Node.js 中使用 Lock Files
2019/06/24 Javascript
js实现div色块拖动录制
2020/01/16 Javascript
jQuery实现简单轮播图效果
2020/12/27 jQuery
[02:24]DOTA2亚洲邀请赛 NAVI战队出场宣传片
2015/02/07 DOTA
[48:26]VGJ.S vs infamous Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
Python os模块中的isfile()和isdir()函数均返回false问题解决方法
2015/02/04 Python
Python爬虫学习之翻译小程序
2019/07/30 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
2020/01/10 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
2020/02/25 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
银行出纳岗位职责
2013/11/25 职场文书
投标单位介绍信
2014/01/09 职场文书
幼儿园中秋节活动方案2013
2014/01/29 职场文书
《浅水洼里的小鱼》听课反思
2014/02/28 职场文书
酒店优秀员工事迹材料
2014/06/02 职场文书
新闻发布会策划方案
2014/06/12 职场文书
2015年幼儿园班主任个人工作总结
2015/10/22 职场文书
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python
SpringBoot接入钉钉自定义机器人预警通知
2022/07/15 Java/Android