通过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的一些看法
May 27 Javascript
XMLHTTPRequest的属性和方法简介
Nov 23 Javascript
javascript验证手机号和实现星号(*)代替实例
Aug 16 Javascript
ES2015 Symbol 一种绝不重复的值
Dec 25 Javascript
JS实现的验证身份证及获取地区功能示例
Jan 16 Javascript
JS简单实现数组去重的方法分析
Oct 14 Javascript
详解使用webpack构建多页面应用
Dec 21 Javascript
JavaScript基础心法 数据类型
Mar 05 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
Dec 19 Javascript
基于Element封装一个表格组件tableList的使用方法
Jun 29 Javascript
JS call()及apply()方法使用实例汇总
Jul 11 Javascript
一篇文章带你从零快速上手Rollup
Sep 07 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
提高define性能的php扩展hidef的安装和使用
2011/06/14 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
2013/06/18 PHP
PHP连接Access数据库的方法小结
2013/06/20 PHP
php操作memcache缓存方法分享
2015/06/03 PHP
PHP实现加强版加密解密类实例
2015/07/29 PHP
zen_cart实现支付前生成订单的方法
2016/05/06 PHP
深入剖析浏览器退出之后php还会继续执行么
2016/05/17 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
flash 得到自身url参数的代码
2009/11/15 Javascript
关于document.cookie的使用javascript
2010/10/29 Javascript
NodeJS框架Express的模板视图机制分析
2011/07/19 NodeJs
brook javascript框架介绍
2011/10/10 Javascript
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
JavaScript jquery及AJAX小结
2016/01/24 Javascript
JQuery遍历元素的父辈和祖先的方法
2016/09/18 Javascript
巧用Vue.js+Vuex制作专门收藏微信公众号的app
2016/11/03 Javascript
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
2019/04/28 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
如何在JavaScript中创建具有多个空格的字符串?
2020/02/23 Javascript
js实现轮播图特效
2020/05/28 Javascript
vue离开当前页面触发的函数代码
2020/09/01 Javascript
[01:33]真香警告!DOTA2勇士令状不朽珍藏Ⅱ饰品欣赏
2018/06/26 DOTA
Python实现遍历windows所有窗口并输出窗口标题的方法
2015/03/13 Python
Python中struct模块对字节流/二进制流的操作教程
2017/01/21 Python
基于python(urlparse)模板的使用方法总结
2017/10/13 Python
Django入门使用示例
2017/12/12 Python
Python命令行解析模块详解
2018/02/01 Python
Pandas实现数据类型转换的一些小技巧汇总
2018/05/07 Python
Python3实现mysql连接和数据框的形成(实例代码)
2020/01/17 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
英国花园家具中心:Garden Furniture Centre
2017/08/24 全球购物
小学生暑假安全公约
2015/07/14 职场文书
嘉年华活动新闻稿
2015/07/17 职场文书
2016年国庆节新闻稿范文
2015/11/25 职场文书
redis击穿 雪崩 穿透超详细解决方案梳理
2022/03/17 Redis