通过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里的each使用方法详解
Dec 22 Javascript
JavaScript解析json格式数据简单示例
Dec 09 Javascript
javascript进行四舍五入方法汇总
Dec 16 Javascript
js实现汉字排序的方法
Jul 23 Javascript
利用Angularjs和原生JS分别实现动态效果的输入框
Sep 01 Javascript
详解Angular.js指令中scope类型的几种特殊情况
Feb 21 Javascript
原生js实现移动端触摸轮播的示例代码
Dec 22 Javascript
vuex如何重置所有state(可定制)
Jan 17 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
Sep 02 Javascript
js 计数排序的实现示例(升级版)
Jan 12 Javascript
jQuery加PHP实现图片上传并提交的示例代码
Jul 16 jQuery
使用JavaScript实现贪吃蛇游戏
Sep 29 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
mysql 字段类型说明
2007/04/27 PHP
php下通过POST还是GET来传值
2008/06/05 PHP
PHP 超链接 抓取实现代码
2009/06/29 PHP
非常好用的两个PHP函数 serialize()和unserialize()
2012/02/04 PHP
使用 laravel sms 构建短信验证码发送校验功能
2017/11/06 PHP
关于javascript function对象那些迷惑分析
2011/10/24 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
获取JS中网页各种高宽与位置的方法总结
2016/07/27 Javascript
Bootstrap模态窗口源码解析
2017/02/08 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
jQuery实现的中英文切换功能示例
2019/01/11 jQuery
koa+mongoose实现简单增删改查接口的示例代码
2019/05/13 Javascript
JS控制GIF图片的停止与显示
2019/10/24 Javascript
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
[01:09:20]NB vs NAVI Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
Python常见文件操作的函数示例代码
2011/11/15 Python
Python3基础之条件与循环控制实例解析
2014/08/13 Python
简单实现python进度条脚本
2017/12/18 Python
Python实现简单石头剪刀布游戏
2021/01/20 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
2020/03/01 Python
PyCharm 在Windows的有用快捷键详解
2020/04/07 Python
文件上传服务器-jupyter 中python解压及压缩方式
2020/04/22 Python
详解CSS3伸缩布局盒模型Flex布局
2018/08/20 HTML / CSS
德国孕妇装和婴童服装网上商店:bellybutton
2018/04/12 全球购物
英国手机零售商:Carphone Warehouse
2018/06/06 全球购物
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
鼓舞士气的口号
2014/06/16 职场文书
社区务虚会发言材料
2014/10/20 职场文书
2015教师年度考核评语
2015/03/25 职场文书
道歉信怎么写
2015/05/12 职场文书
协议书格式模板
2016/03/24 职场文书
导游词之河北滦平金山岭长城
2019/10/16 职场文书
七年级作文之游记
2019/12/11 职场文书
Python读取和写入Excel数据
2022/04/20 Python