通过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 相关文章推荐
HTML TO JavaScript 转换
Jun 26 Javascript
在IE上直接编辑网页内容的js代码(IE地址栏js)
Apr 27 Javascript
jQuery 扩展对input的一些操作方法
Oct 30 Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
Nov 11 Javascript
JavaScript对HTML DOM使用EventListener进行操作
Oct 21 Javascript
基于JQuery实现图片轮播效果(焦点图)
Feb 02 Javascript
有趣的bootstrap走动进度条
Dec 01 Javascript
EasyUI学习之DataGird分页显示数据
Dec 29 Javascript
浅谈JavaScript异步编程
Jan 20 Javascript
jQuery轻松实现无缝轮播效果
Mar 22 jQuery
大转盘抽奖小程序版 转盘抽奖网页版
Apr 16 Javascript
JS错误处理与调试操作实例分析
Apr 13 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
php+redis消息队列实现抢购功能
2018/02/08 PHP
Javascript匿名函数的一种应用 代码封装
2010/06/27 Javascript
JQuery中html()方法使用不当带来的陷阱
2011/04/07 Javascript
jquery实现漂浮在网页右侧的qq在线客服插件示例
2013/05/13 Javascript
jquery实现从数组移除指定的值
2015/06/24 Javascript
JavaScript数组对象实现增加一个返回随机元素的方法
2015/07/27 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
Angularjs中的ui-bootstrap的使用教程
2017/02/19 Javascript
分享19个JavaScript 有用的简写写法
2017/07/07 Javascript
Node.js实现连接mysql数据库功能示例
2017/09/15 Javascript
vue 注册组件的使用详解
2018/05/05 Javascript
Node.js搭建WEB服务器的示例代码
2018/08/15 Javascript
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
2020/02/12 Javascript
详解Python多线程
2016/11/14 Python
Python编程中NotImplementedError的使用方法
2018/04/21 Python
使用NumPy和pandas对CSV文件进行写操作的实例
2018/06/14 Python
基于Python实现定时自动给微信好友发送天气预报
2018/10/25 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
python生成特定分布数的实例
2019/12/05 Python
关于numpy数组轴的使用详解
2019/12/05 Python
Python对称的二叉树多种思路实现方法
2020/02/28 Python
python 画条形图(柱状图)实例
2020/04/24 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
聊聊python中的异常嵌套
2020/09/01 Python
python批量提取图片信息并保存的实现
2021/02/05 Python
scrapy-splash简单使用详解
2021/02/21 Python
英国玛莎百货澳大利亚:Marks & Spencer Australia
2019/08/30 全球购物
父母寄语大全
2014/04/12 职场文书
工作证明格式及范本
2014/09/12 职场文书
局机关干部群众路线个人对照检查材料思想汇报
2014/10/05 职场文书
校长个人总结
2015/03/03 职场文书
银行实习推荐信
2015/03/27 职场文书
2016新年感言
2015/08/03 职场文书
MySQL kill不掉线程的原因
2021/05/07 MySQL
MyBatis配置文件解析与MyBatis实例演示
2022/04/07 Java/Android
css3 文字断裂效果
2022/04/22 HTML / CSS