首页 > 其他分享 >【个人前端笔记】手写EventHub

【个人前端笔记】手写EventHub

时间:2024-03-04 14:23:04浏览次数:25  
标签:string 笔记 eventName eventMap EventHub 手写 data fn

一、EventHub
EventHub是对发布-订阅模式的一种实现。它是一种集中式事件处理机制,允许不同的模块之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的。

二、EventHub优缺点
优点:
1.通过EventHub实现所有模块之间通信的技术。在vue2中可以用事件总线实现任意组件间传递数据
2.EventHub可以在不引入第三方库实现
缺点:
1.共用同一个命名空间,后期代码可维护性差
2.若不及时销毁不再使用的监听器,容易引发内存泄漏

三、EventHub代码实现(ts)

type EventFn = (data?:any) => void

interface eventhub {
  eventMap:{[k:string]:EventFn[]}
  on:(eventName:string,eventFn:EventFn) => void
  emit:(eventName:string,data?:[any],thisObj?:object) => void
  remove:(eventName:string,eventFn:EventFn) => void
}

class EventHub implements eventhub {
  eventMap:eventhub["eventMap"] = {}

  on(eventName:string,fn:EventFn){
    if (fn instanceof Function === false) throw new Error("仅支持函数!");
    
    this.eventMap[eventName] = this.eventMap[eventName] || []
    this.eventMap[eventName].push(fn)
  }

  emit(eventName: string,data?:[any],thisObj?:object){
    if (data && thisObj) {
      this.eventMap[eventName]?.forEach(fn => fn.apply(thisObj,data))
    }else if (data) {      
      this.eventMap[eventName]?.forEach(fn => fn(...data))
    }else{
      this.eventMap[eventName]?.forEach(fn => fn())
    }
  }

  remove(eventName:string,fn:EventFn){
    let index = -1
    index = this.eventMap[eventName].indexOf(fn)
    if (index === -1) return;
    this.eventMap[eventName].splice(index,1)
  }
}

export default EventHub

标签:string,笔记,eventName,eventMap,EventHub,手写,data,fn
From: https://www.cnblogs.com/icerain-black/p/18051723

相关文章

  • 黑马程序员JavaWeb学习笔记-HTML
    HTML-新浪新闻HTML格式化代码mac:sheft+option+Fwin:ctrl+alt+L--标题排版<!--文档类型为HTML--><!DOCTYPEhtml><htmllang="en"><head><!--字符集为UTF-8--><metacharset="UTF-8"><!--设置浏览器兼容性-->......
  • 【个人前端笔记】手写对象深拷贝
    一、对象深拷贝简单的方法:JSON序列化方法通过将对象转换成JSON格式并转换回对象,实现深拷贝leta1={a:"hello",b:"world",c:[1,2,3],d:{a:1,b:2}}leta2=JSON.parse(JSON.stringify(a1))console.log(a2);JSON序列化拷贝的缺点a.不支持......
  • Java学习笔记——第五天
    方法什么是方法方法是一种语法结构,它可以把一段代码封装成一个功能,以便重复调用。定义方法时可以指定形参,形参没有实际意义,仅仅起到占位和提示实参种类的作用,名字要有意义。调用方法时可以指定实参,实参由实际意义,是方法运行时事实上使用的数值。return关键字可以用来......
  • 3.4 STL 学习笔记一
    这是初次学习STL的相关知识。可能之后还会补充笔记。STL是提高C++编写效率的一个利器1.#includevector是变长数组,支持随机访问,不支持在任意位置O(1)插入。为了保证效率,元素的增删一般应该在末尾进行。1.1声明include//头文件vectora;//相当于一个长度变化的int数组......
  • vue3笔记3watch监视的几种变化
    <template> <divclass="about">  <p>情况一,监事ref的值</p>  <h1>求和{{sum}}</h1>  <button@click="changeSum">++++</button> </div></template><scriptlang="ts"......
  • Living-Dream 系列笔记 第28期
    本期讲解了进制转换。T1考验代码能力的好题。首先需要判断输入的坐标是RXCY型还是Excel型:直接扫一遍字符串,若存在一个字母前面是数字,则说明是RXCY型,否则是Excel型。这一部分的代码:boolcheck(strings){ for(inti=0;s[i];i++) if(isupper(s[i])&&isdigit(s[i......
  • Living-Dream 系列笔记 第26期
    ProblemT1见题解。T2/*思路:枚举每一头牛说的话,尝试将Bessie置于pi处,再枚举其他牛说的话,检验不合法的数量,取max即为答案。*/#include<bits/stdc++.h>usingnamespacestd;intn,ans=1e9;structnode{charop;intp;}a[1031];intmain(){cin>>n;......
  • Living-Dream 系列笔记 第25期
    ProblemT1/*思路:对于操作1,直接+=拼接即可;对于操作2,直接令s=s.substr(a,b)即可;对于操作3,直接令s=s.insert(a,t)即可;对于操作4,直接s.find(str)即可,注意特判-1。*/#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intq;strings;signedmain(){......
  • Living-Dream 系列笔记 第23期
    ProblemT1/*思路:我们可以忽略两人碰到后转向的过程,直接视为两人彼此穿过了对方,这样算距离是不变的,时间也是不变的,所以合法。通过上述分析,那么最小时间即为对于每一个士兵往左/右走的时间取min再取max,最大时间反之亦然。*/#include<bits/stdc++.h>usingnamespacestd;......
  • Living-Dream 系列笔记 第24期
    ProblemT1/*思路:暴力枚举所有的和,用桶标记每个和出现的次数,找最大值且编号最小即可。*/#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;ints1,s2,s3;intsum=-1e9,ans;intmp[131];signedmain(){ ios::sync_with_stdio(0); cin>>s1>>s2>>s3;......