国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

JavaScript 中事件發射器(Event Emitters)背后的魔力

開發 前端
朋友們,作為一名軟件工程師,你一定用過Event Emitter,我們經常用它來處理跨組件的通信場景。

什么是事件發射器(Event Emitter)?

朋友們,作為一名軟件工程師,你一定用過Event Emitter,我們經常用它來處理跨組件的通信場景。

它觸發了一個每個人都可以收聽的事件,并且可以在事件觸發時發送數據。

不同的庫提供不同的實現,用于不同的目的,但基本思想是提供一個用于發布和訂閱事件的框架。

你想知道它背后的魔力嗎?本文將與你分享一個非常簡單的解決方案來實現它。

我們一起來試試。

請用以下這個例子來玩一會兒。


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
html, body{
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
}

.box{
padding-top: 30px;
}
</style>
</head>
<body>
<div class="buttons">
<button>Please send me data</button>
<button>Cut off contact</button>
</div>
<div class="box">
The data you sent me is:
<div class="data"></div>
</div>
<script>
class EventEmitter {
on = (eventName, callback) => window.addEventListener(eventName, callback, false)
off = (eventName, callback) => window.removeEventListener(eventName, callback, false)
emit = (eventName, data) => window.dispatchEvent(new CustomEvent(eventName, { detail: data }))
}

const emitter = new EventEmitter()
const buttons = document.querySelectorAll('button')
const $data = document.querySelector('.data')
let count = 0

const listentCallback = () => {
$data.innerHTML = JSON.stringify(event.detail, null, 2)
}

emitter.on('event-fatfish', listentCallback)

buttons[0].addEventListener('click', () => {
count++
emitter.emit('event-fatfish', { name: 'fatfish', count })
})

buttons[1].addEventListener('click', () => {
emitter.off('event-fatfish', listentCallback)
})
</script>
</body>
</html>

輸出:

圖片

當你點擊 Please send me data 按鈕時,你會看到 count 的值越來越大,但是在你點擊 Cut off contact 之后,它就不再變化了。

這個例子很簡單,但足以說明有關 Event Emitter 的一切。

來,我們開始吧!

Event Emitter 只需幾行代碼就可以完成,這真是太神奇了。

class EventEmitter {
on = (eventName, callback) => window.addEventListener(eventName, callback, false)
off = (eventName, callback) => window.removeEventListener(eventName, callback, false)
emit = (eventName, data) => window.dispatchEvent(new CustomEvent(eventName, { detail: data }))
}

1. 監聽事件

const emitter = new EventEmitter()
const eventCallback = (event) => {
console.log('eventCallback', event.detail)
}

emitter.on('event-xxx', eventCallback)

2. 發布事件

eventCallback 將打印兩次數據,因為我們兩次發布了 event-xxx 事件。

emitter.emit('event-xxx', { name: 'fatfish' })
emitter.emit('event-xxx', { name: 'medium' })

3.解除事件

當我們解除 event-xxx 事件時,不再打印 medium 和 fatfish。

emitter.off('event-xxx', eventCallback)
emitter.emit('event-xxx', { name: 'medium and fatfish' })

圖片

CustomEvent 是謎題的答案

實現 EventEmitter 的關鍵是 CustomEvent 和瀏覽器的事件機制,你可以從這里得到:https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent。

CustomEvent() 構造函數創建一個新的 CustomEvent 對象?!獊碜?MDN

// create custom events
const catFound = new CustomEvent('animalfound', {
detail: {
name: 'cat'
}
})
const dogFound = new CustomEvent('animalfound', {
detail: {
name: 'dog'
}
})
// add an appropriate event listener
window.addEventListener('animalfound', (e) => console.log(e.detail.name))
// dispatch the events
window.dispatchEvent(catFound)
window.dispatchEvent(dogFound)

實現事件發射器的另一種方法

雖然,這種方法很簡單,但它依賴于瀏覽器環境,還有其他更好的解決方案嗎?


class EventEmitter {
constructor () {
this.events = {}
}
on (evt, callback, ctx) {
if (!this.events[ evt ]) {
this.events[ evt ] = []
}

this.events[ evt ].push(callback)
return this
}

emit (evt, ...payload) {
const callbacks = this.events[ evt ]
if (callbacks) {
callbacks.forEach((cb) => cb.apply(this, payload))
}
return this
}
off (evt, callback) {
// Cancel all subscribed events
if (typeof evt === 'undefined') {
delete this.events
} else if (typeof evt === 'string') {
// Delete the subscriber of the specified event
if (typeof callback === 'function') {
this.events[ evt ] = this.events[ evt ].filter((cb) => cb !== callback)
} else {
// Delete event directly
delete this.events[ evt ]
}
}
return this
}
}
const e1 = new EventEmitter()
const e1Callback = (name) => {
console.log(name, 'e1Callback')
}
const e2Callback = (name, sex) => {
console.log(name, 'e2Callback')
}
e1.on('evt1', e1Callback)
e1.on('evt2', e2Callback)
e1.emit('evt1', 'fatfish') // fatfish e1Callback
e1.emit('evt2', 'medium') // medium e2Callback
e1.off('evt1', e1Callback)
e1.emit('evt1', 'fatfish') // fatfish e1Callback will not be printed
e1.emit('evt2', 'medium') // medium e2Callback

圖片

寫在最后

以上就是我今天跟你分享的關于事件發射器的全部內容,不知道你還有沒有其他更好的實現方法?如果有的話,請記得在留言區跟我分享你的解決方案,在此,非常感謝。

看完今天內容,如果你覺得有用的話,請記得點贊我,關注我,并將這篇內容分享給你的朋友們,也許能夠幫助到他。

最后,感謝你的閱讀,編程愉快!

責任編輯:華軒 來源: web前端開發
相關推薦

2016-09-19 08:32:16

2011-08-29 14:59:26

QtEvent事件

2011-07-04 14:50:49

QT Event 事件

2011-06-16 14:38:18

JavaScript事件委托

2017-01-05 09:07:25

JavaScript瀏覽器驅動

2017-07-25 12:42:23

互聯網

2009-06-17 09:48:11

javascript手事件參考

2024-08-01 12:08:52

2016-10-09 08:38:01

JavaScript瀏覽器事件

2016-08-19 15:30:14

深信服

2025-03-19 10:22:09

JavaScript編程語言開發

2021-11-11 11:24:54

JavaScript模型事件

2023-02-26 10:59:51

2023-02-19 12:44:07

領域事件DDD

2012-09-27 09:08:55

刀片服務器服務器模塊化

2021-10-15 09:56:10

JavaScript異步編程

2012-10-24 11:08:38

刀片服務器刀片服務器廠商魔力象限

2016-04-12 09:27:59

2024-02-04 17:16:22

ReactVue前端

2017-08-24 14:12:00

微軟Azure無服務器
點贊
收藏

51CTO技術棧公眾號

国产传媒av在线| 亚洲国产成人私人影院tom| 黄色片在线免费| av电影在线网| 在线欧美不卡| 欧美tickling挠脚心丨vk| 久久免费视频在线观看| 欧美成熟毛茸茸复古| 午夜精品毛片| 午夜精品www| av在线精品| 日韩禁在线播放| 国产一二三四五| 免费萌白酱国产一区二区三区| 亚洲综合自拍偷拍| 99久re热视频这里只有精品6| 欧美精品hd| 免费av不卡| 国产成人精品亚洲日本在线桃色| 欧美精品三级在线观看| 国产乱子伦农村叉叉叉| 亚洲制服av| 亚洲在线www| 国产欧美日韩免费观看| 337p日本欧洲亚洲大胆色噜噜| 蜜桃视频日韩| 黄网在线播放| 国产盗摄xxxx视频xxx69 | 日本在线一二三| 欧美黄污视频| 久久精品中文字幕免费mv| 亚洲精华国产| 又黄又爽在线免费观看| 我不卡影院28| 91成人福利在线| 台湾佬成人网| 中文字幕电影一区| 91亚洲va在线va天堂va国 | yiren22综合网成人| 亚洲欧美成aⅴ人在线观看| 亚洲一区二区三区av无码| 日本免费一区二区三区视频| 国产一区欧美二区三区| 久久综合久久综合久久| 大波视频国产精品久久| 激情综合在线| 日本黄色播放器| 久久久不卡网国产精品二区| 女人黄色片免费| 欧美日韩一区成人| 校园春色亚洲| 九九九久久久久久| 久久久影院免费| 日本午夜精品一区二区| 97久久精品人人做人人爽50路| 嫩草影院发布页| 日韩精品中午字幕| www.国产精品一区| 国产精品加勒比| 97se亚洲国产综合自在线不卡| 在线国产1区| 在线亚洲男人天堂| 久久国产成人精品| 肉大捧一出免费观看网站在线播放 | 日本视频一区二区三区| 69久久久久久| 精品国产免费久久久久久尖叫| 久久精品久久精品亚洲人| 久久久久久亚洲综合| 欧美大片免费观看网址| 爆操妹子视频在线观看| 九色91视频| 免费久久99精品国产| 欧美在线观看成人| 国精产品一区一区三区mba桃花| 特级毛片在线免费观看| 91热门视频在线观看| 一本色道久久综合亚洲二区三区 | 日韩av激情| 国产精品理伦片| 欧美14一18处毛片| 欧美日韩国产经典色站一区二区三区| 精品国产一区二区三区av片| av在线影院| 国外视频精品毛片| 欧美黄色一区| 国产最新免费视频| 欧美日韩高清一区二区不卡| 99re6热只有精品免费观看| 2022国产精品| 国产精品一区二区三区乱码| 日韩视频免费播放| 成人免费黄色在线| 无码免费一区二区三区免费播放 | 白嫩少妇丰满一区二区| 欧美亚洲不卡| 91老司机在线| 美女久久久久| 日本成人在线视频网址| 一区二区三区四区日韩| 国产99久久九九精品无码| 日韩一区二区精品葵司在线| 奇米亚洲欧美| www.xxx黄| 久久久av网站| 国产精品88888| 在线视频自拍| 国产成人综合美国十次| 日韩欧美亚洲综合| 亚洲四虎av| 欧美大成色www永久网站婷| 国产成人免费视| 国产伦理精品不卡| 亚洲精品在线二区| 国产精品久久久久久久久久久久 | 色婷婷综合网站| 久久久精品影院| 国产一区二区三区日韩| 青草青在线视频| 国产美女在线精品| 日韩精品影院| 自慰无码一区二区三区| 国产a级全部精品| 一区二区三区四区视频精品免费 | 久久蜜桃香蕉精品一区二区三区| 欧美寡妇性猛交xxx免费| a优女a优女片| 92看片淫黄大片一级| 欧美国产日本在线| 午夜精品爽啪视频| 亚洲美女一区| 国产区精品区| 视频国产在线观看| 欧美撒尿777hd撒尿| 99欧美视频| 久久av少妇| 国产成人女人毛片视频在线| 欧美在线免费视屏| 一区二区国产在线观看| 久cao在线| 亚洲免费久久| 亚洲天堂av电影| 91婷婷韩国欧美一区二区| 高清久久一区| 成人3d漫画免费无遮挡软件| 国产精品91久久久| 色婷婷亚洲精品| 9色精品在线| 手机在线理论片| 国产v亚洲v天堂无码久久久| 国产精品成人一区二区| 在线观看www91| 免费美女久久99| 疯狂欧洲av久久成人av电影| av电影免费| 国产精品久久久久久久免费大片| 制服.丝袜.亚洲.中文.综合| 毛片不卡一区二区| a一区二区三区亚洲| 毛片.com| 狠狠色伊人亚洲综合网站色| 亚洲国产精品国自产拍av秋霞| 成人自拍视频在线| 久久99高清| 羞羞的视频在线看| 日本福利视频在线| 国产精品中文久久久久久久| 91精品在线一区二区| 成人h动漫精品一区二| 欧美人与牛zoz0性行为| 天堂中文а√在线| 国产精品裸体瑜伽视频| 久久97精品久久久久久久不卡| 国产精品久久久久久久久免费看| 奇米色一区二区| 欧美成人高清视频在线观看| 特黄特色特刺激视频免费播放 | 亚洲国产日韩a在线播放性色| 国产日韩欧美| 国产精品美女久久久久人| 偷拍自拍在线视频| 日韩精品第1页| 国产精品国模在线| 欧美不卡一二三| 中文字幕中文在线不卡住| 亚洲美女色禁图| 日本精品视频| 久久久国产影院| 五月天丁香久久| 国产成人av影院| 99精品电影| 99久热在线精品视频观看| 国产私拍精品| 日韩av资源在线| 免费观看成人高| 国产成人精品久久亚洲高清不卡| 日韩精品免费在线观看| 婷婷久久综合九色国产成人| 99久久免费视频.com| 夜夜夜久久久|