通过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 css styleFloat和cssFloat
Mar 15 Javascript
jquery设置按钮停顿3秒不可用
Mar 07 Javascript
JavaScript获取DOM元素的11种方法总结
Apr 25 Javascript
JS面向对象编程详解
Mar 06 Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
Jul 01 Javascript
d3.js实现简单的网络拓扑图实例代码
Nov 06 Javascript
iscroll动态加载数据完美解决方法
Jul 18 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
Jan 25 Javascript
layui 监听表格复选框选中值的方法
Aug 15 Javascript
react 父子组件之间通讯props
Sep 08 Javascript
mapboxgl区划标签避让不遮盖实现的代码详解
Jul 01 Javascript
js之ajax文件上传
May 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强制下载类型的实现代码
2011/04/21 PHP
PHP的基本常识小结
2013/07/05 PHP
php curl post 时出现的问题解决
2014/01/30 PHP
PHP中Memcache操作类及用法实例
2014/12/12 PHP
js+FSO遍历文件夹下文件并显示
2007/03/07 Javascript
JavaScript.The.Good.Parts阅读笔记(一)假值与===运算符
2010/11/16 Javascript
使用js判断数组中是否包含某一元素(类似于php中的in_array())
2013/12/12 Javascript
js关于字符长度限制的问题示例探讨
2014/01/24 Javascript
一行命令搞定node.js 版本升级
2014/07/20 Javascript
jQuery控制TR显示隐藏的三种常用方法
2014/08/21 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
2015/09/19 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
2015/12/13 Javascript
值得分享的bootstrap table实例
2016/09/22 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
2017/04/07 Javascript
静态页面实现 include 引入公用代码的示例
2017/09/25 Javascript
JavaScript之创意时钟项目(实例讲解)
2017/10/23 Javascript
原生JavaScript实现remove()和recover()功能示例
2018/07/24 Javascript
JS重学系列之聊聊new操作符
2019/03/04 Javascript
详解使用WebPack搭建React开发环境
2019/08/06 Javascript
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
在java中如何定义一个抽象属性示例详解
2017/08/18 Python
在python中使用with打开多个文件的方法
2019/01/07 Python
itchat-python搭建微信机器人(附示例)
2019/06/11 Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
2020/06/04 Python
python解包用法详解
2021/02/17 Python
施华洛世奇澳大利亚官网:SWAROVSKI澳大利亚
2017/01/06 全球购物
波兰家居和花园家具专家:4Home
2019/05/26 全球购物
Hanky Panky官方网站:内衣和睡衣
2019/07/25 全球购物
厨师岗位职责
2013/11/12 职场文书
养生餐厅创业计划书范文
2014/03/26 职场文书
高中学校对照检查材料
2014/08/31 职场文书
村主任群众路线个人对照检查材料
2014/09/26 职场文书
中学教代会开幕词
2016/03/04 职场文书
python实现语音常用度量方法的代码详解
2021/05/25 Python
【DOTA2】当街暴打?PSG LGD vs VG - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA