通过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 相关文章推荐
让GoogleCode的SVN下的HTML文件在FireFox下正常显示.
May 25 Javascript
jquery拖动插件(jquery.drag)使用介绍
Jun 18 Javascript
javascript 用函数语句和表达式定义函数的区别详解
Jan 06 Javascript
js跳转页面方法实现汇总
Feb 11 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
Mar 08 Javascript
javascript实现数字倒计时特效
Mar 30 Javascript
JavaScript事件学习小结(一)事件流
Jun 09 Javascript
JS百度地图搜索悬浮窗功能
Jan 12 Javascript
浅析vue component 组件使用
Mar 06 Javascript
js读取json文件片段中的数据实例
Mar 09 Javascript
Angular2 父子组件数据通信实例
Jun 22 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
Mar 06 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
附件名前加网站名
2008/03/23 PHP
基于header的一些常用指令详解
2013/06/06 PHP
深入浅析php json 格式控制
2015/12/24 PHP
PHP几个实用自定义函数小结
2016/01/25 PHP
PHP封装cURL工具类与应用示例
2019/07/01 PHP
用Javascript 和 CSS 实现脚注(Footnote)效果
2009/09/09 Javascript
javascript奇异的arguments分析
2010/10/20 Javascript
jquery实现动态菜单的实例代码
2013/11/28 Javascript
QQ空间顶部折页撕开效果示例代码
2014/06/15 Javascript
JQuery实现Ajax加载图片的方法
2015/12/24 Javascript
javascript中Date对象应用之简易日历实现
2016/07/12 Javascript
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
Vuex实现计数器以及列表展示效果
2018/03/10 Javascript
JQuery animate动画应用示例
2019/05/14 jQuery
layui实现数据表格点击搜索功能
2020/03/26 Javascript
通过微信公众平台获取公众号文章的方法示例
2019/12/25 Javascript
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
python中类变量与成员变量的使用注意点总结
2017/04/29 Python
理论讲解python多进程并发编程
2018/02/09 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
如何使用localstorage代替cookie实现跨域共享数据问题
2018/04/18 HTML / CSS
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
Java如何调用外部Exe程序
2015/07/04 面试题
《锄禾》教学反思
2014/04/08 职场文书
爱耳日活动总结
2014/04/30 职场文书
团代会宣传工作方案
2014/05/08 职场文书
暑假安全教育广播稿
2014/09/10 职场文书
学生抄作业检讨书(2篇)
2014/10/17 职场文书
置业顾问岗位职责
2015/02/09 职场文书
好好学习保证书
2015/02/26 职场文书
企业财务总监岗位职责
2015/04/03 职场文书
教你如何用python开发一款数字推盘小游戏
2021/04/14 Python
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python
无线电知识基础入门篇
2022/02/18 无线电
《游戏王:大师决斗》将推出新卡牌包4月4日上线
2022/03/31 其他游戏