通过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栏目列表隐藏/显示简单实现
Apr 03 Javascript
js生成随机数之random函数随机示例
Dec 20 Javascript
javascript对JSON数据排序的3个例子
Apr 12 Javascript
获取中文字符串的实际长度代码
Jun 05 Javascript
js中运算符&& 和 || 的使用记录
Aug 21 Javascript
JScript实现地址选择功能
Aug 15 Javascript
JS中关于正则的巧妙操作
Aug 31 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
Aug 28 Javascript
解决vue项目nginx部署到非根目录下刷新空白的问题
Sep 27 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
Nov 07 jQuery
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
Apr 01 jQuery
文章或博客自动生成章节目录索引(支持三级)的实现代码
May 10 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时区问题
2008/03/26 PHP
用PHP进行MySQL删除记录操作代码
2008/06/07 PHP
深入解析php之sphinx
2013/05/15 PHP
Laravel 4 初级教程之安装及入门
2014/10/30 PHP
浅谈PHP解析URL函数parse_url和parse_str
2014/11/11 PHP
PHP操作文件的一些基本函数使用示例
2014/11/18 PHP
PHP foreach遍历多维数组实现方式
2016/11/16 PHP
详解php几行代码实现CSV格式文件输出
2017/07/01 PHP
Laravel如何创建服务器提供者实例代码
2019/04/15 PHP
Aster vs KG BO3 第二场2.19
2021/03/10 DOTA
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
JavaScript获取XML数据附示例截图
2014/03/05 Javascript
手机端页面rem宽度自适应脚本
2015/05/20 Javascript
Express的路由详解
2015/12/10 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
2016/02/17 Javascript
Bootstrap框架实现广告轮播效果
2016/11/28 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
2017/05/17 Javascript
laravel5.4+vue+element简单搭建的示例代码
2017/08/29 Javascript
JavaScript 自定义事件之我见
2017/09/25 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
JavaScript实现的拼图算法分析
2019/02/13 Javascript
vue-cli3添加模式配置多环境变量的方法
2019/06/05 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
JS算法教程之字符串去重与字符串反转
2020/12/15 Javascript
Python的加密模块md5、sha、crypt使用实例
2014/09/28 Python
python实现简单点对点(p2p)聊天
2017/09/13 Python
python tkinter实现屏保程序
2019/07/30 Python
Node.js 和 Python之间该选择哪个?
2020/08/05 Python
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
美国女性运动零售品牌:Lady Foot Locker
2017/05/12 全球购物
什么是表空间(tablespace)和系统表空间(System tablespace)
2013/02/25 面试题
机电一体化大学生求职信
2013/11/08 职场文书
给护士表扬信
2014/01/19 职场文书
护理专业自我鉴定
2014/01/30 职场文书
校园安全演讲稿
2014/05/09 职场文书
幼儿园老师个人总结
2015/02/28 职场文书