惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
The Blog of Author Tim Ferriss
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
有赞技术团队
有赞技术团队
量子位
S
SegmentFault 最新的问题
博客园 - 聂微东
博客园 - 【当耐特】
J
Java Code Geeks
美团技术团队
Hugging Face - Blog
Hugging Face - Blog
H
Help Net Security
V
V2EX
人人都是产品经理
人人都是产品经理
博客园 - Franky
罗磊的独立博客
Engineering at Meta
Engineering at Meta
A
About on SuperTechFans
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
云风的 BLOG
云风的 BLOG
Y
Y Combinator Blog
Apple Machine Learning Research
Apple Machine Learning Research

牛牛技术客栈

设计模式-备忘录模式 - OXOXTECH 牛牛技术客栈 设计模式-中介者模式 - OXOXTECH 牛牛技术客栈 Linux【Ubuntu】修改ssh默认端口 - OXOXTECH 牛牛技术客栈 设计模式-迭代器模式 - OXOXTECH 牛牛技术客栈 scheduled定时任务的三种基本实现方式 - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(三) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(二) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(一) - OXOXTECH 牛牛技术客栈 基于JavaFX的桌面端网络调试工具 - OXOXTECH 牛牛技术客栈 Golang Channel的原理介绍 - OXOXTECH 牛牛技术客栈 Go语言Map的原理分析 - OXOXTECH 牛牛技术客栈 Go语言错误处理(panic)的最佳实践 - OXOXTECH 牛牛技术客栈 设计模式-解释器模式 - OXOXTECH 牛牛技术客栈 Redis报错Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. go-webpbin库在Linux报错failed to encode image to WebP: exit status 1.......的问题 exe4j 打包加密的jar - OXOXTECH 牛牛技术客栈 Go生成图形验证码示例 - OXOXTECH 牛牛技术客栈 澳门一天游:一日尽享东方与西方的交融之美 - OXOXTECH 牛牛技术客栈 设计模式-命令模式 - OXOXTECH 牛牛技术客栈 别再自己瞎写工具类了,SpringBoot内置工具类应有尽有 - OXOXTECH 牛牛技术客栈 中山一日游 - OXOXTECH 牛牛技术客栈 设计模式-责任链模式 - OXOXTECH 牛牛技术客栈 起舞吧,齐舞吧 - OXOXTECH 牛牛技术客栈 设计模式-组合模式 - OXOXTECH 牛牛技术客栈 Go语言Web开发|GoFrame框架入门笔记 - OXOXTECH 牛牛技术客栈 Java打包exe教程 - OXOXTECH 牛牛技术客栈 设计模式-代理模式 - OXOXTECH 牛牛技术客栈 MySQL存储过程的优缺点有哪些? - OXOXTECH 牛牛技术客栈 前端渲染优化有哪些? - OXOXTECH 牛牛技术客栈 HTTP状态码及其含义 - OXOXTECH 牛牛技术客栈
TypeScript事件派发管理器 - OXOXTECH 牛牛技术客栈
花先生 · 2024-06-07 · via 牛牛技术客栈

花先生 前端 Javascript, 技术, Map, TypeScript

typeScript简单的事件管理器实现事件派发

1、原理

   在全局函数中定义一个map存储事件名与要处理事件的回调函数,会有多个地方监听事件执行,所以处理事件的回调函数要数组保存。

当调用了被监听的函数执行了,其他页面写入的回调函数也会自动执行。

看代码了解一下

// 定义存储的map
 var eventMap = new Map()
 // 某事件名称
 var eventName = "eventName" 
 
 /*   页面A中    */
 // 写入监听
 var eventArr =  eventMap.get(eventName)
 if (eventArr != undefined) {
 eventArr.push(fn)
 } else {
 var eventArr = []
 eventArr.push(fn)
 }
 eventMap.set(eventName, eventArr)
 
 function fn(){
 console.log("页面A")
 }
 
 
 /*   页面B中   */
 var eventArr =  eventMap.get(eventName)
 for(var i = 0; i < eventArr.length; i++) {
 eventArr[i]() // 执行监听方法
 }

代码中在页面b执行了页面A的代码,就是页面B的事件派发到了页面A中执行了

2、实现步骤

我们使用typescript封装实现定义一个回调函数

202406071621061005.webp

定义事件管理类

202406071623315121.webp

202406071623581195.webp

202406071624149636.webp

代码中定义了三个方法,添加监听、移除监听、派发事件

3、开始使用

举个例子,我们玩游戏,当完成一个关卡后都会有一个结算的页面,告诉你得到了多少金币,而当前的页面在结算页面,游戏的首页也有一个展示你当前的金币,而你要做的事情是我完成一个关卡后得到的金币要同步到首页中展示,就要在结算页面去调用首页页面的代码。有同学就会用到了本地存储,把最新的金币数量存入到本地,打开或返回首页的时候再获取一下本地数据。有同学也会想到重新请求服务器接口。但是本地存储容易造成用户篡改,信息展示与数据库的会不一致,重新请求接口对服务器压力虽然不大,网络不好的情况下有延迟。

使用事件派发可以很好的解决问题

在需要派发的页面执行事件派发,比如在结算页面执行

EventManager.emit("species", "10000")

在需要监听的页面执行监听事件执行,比如在首页

EventManager.on("species", this.upSpecies, this) // 设备在线

upSpecies 是首页这里定义的方法

202406071642147795.webp

值得注意的是,监听函数后面传入的this,如果没有传入this,那么upSpecies 方法里面的this会报错

当你离开了首页,首页的active结束了,记得关闭一下事件监听

EventManager.off("species", this.upSpecies, this) // 设备在线