通过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数据表格插件
Jul 17 Javascript
jQuery中获取Radio元素值的方法
Jul 02 Javascript
json数据的列循环示例
Sep 06 Javascript
Js+Jq获取URL参数的集中方法示例代码
May 20 Javascript
js 模式窗口(模式对话框和非模式对话框)的使用介绍
Jul 17 Javascript
JS数组(Array)处理函数整理
Dec 07 Javascript
JavaScript对象之深度克隆介绍
Dec 08 Javascript
JavaScript学习笔记之ES6数组方法
Mar 25 Javascript
利用浮层使select不可选的实现方法
Dec 03 Javascript
老生常谈js数据类型
Aug 03 Javascript
微信小程序App生命周期详解
Jan 31 Javascript
vue 导航内容设置选中状态样式的例子
Nov 01 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生成固定长度纯数字编码的方法
2015/07/09 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
基于JQuery的数字改变的动画效果--可用来做计数器
2010/08/11 Javascript
三种检测iPhone/iPad设备方向的方法
2014/04/23 Javascript
jQuery插件pagination实现分页特效
2015/04/12 Javascript
深入解读JavaScript中的Hoisting机制
2015/08/12 Javascript
jquery性能优化高级技巧
2015/08/24 Javascript
js实现选中页面文字将其分享到新浪微博
2015/11/05 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
js实现日历的简单算法
2017/01/24 Javascript
bootstrap折叠调用collapse()后data-parent不生效的快速解决办法
2017/02/23 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
2017/08/18 Javascript
详解vue2.0 不同屏幕适配及px与rem转换问题
2018/02/23 Javascript
妙用缓存调用链实现JS方法的重载
2018/04/30 Javascript
深入理解Vue Computed计算属性原理
2018/05/29 Javascript
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
2019/09/06 Javascript
JavaScript Date对象功能与用法学习记录
2020/04/28 Javascript
[18:32]DOTA2 HEROS教学视频教你分分钟做大人-谜团
2014/06/12 DOTA
python检测lvs real server状态
2014/01/22 Python
用python与文件进行交互的方法
2018/03/01 Python
Python(Django)项目与Apache的管理交互的方法
2018/05/16 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
2019/01/17 Python
PYQT5设置textEdit自动滚屏的方法
2019/06/14 Python
使用 Django Highcharts 实现数据可视化过程解析
2019/07/31 Python
获取Pytorch中间某一层权重或者特征的例子
2019/08/17 Python
行政部总经理岗位职责
2014/01/04 职场文书
房地产促销活动方案
2014/03/01 职场文书
祖国在我心中演讲稿600字
2014/09/23 职场文书
事业单位财务人员岗位职责
2015/04/14 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
逃出克隆岛观后感
2015/06/09 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
哪类餐饮行业,最适合在高校创业?
2019/08/19 职场文书
如何利用js在两个html窗口间通信
2021/04/27 Javascript
python创建字典及相关管理操作
2022/04/13 Python
vue使用element-ui按需引入
2022/05/20 Vue.js