JSFiddle - React, Tailwind, and code Playground
by evgkch
Babel + JSX
/**
* <EventEmitter> is a light version of the Nodejs' EventEmitter
* to use it independent from platrform.
* https://nodejs.org/dist/latest-v12.x/docs/api/events.html
*/
class EventEmitter {
constructor() {
/**
* Alias of 'addListener' method
*/
this.on = this.addListener;
/**
* Alias of 'removeListener' method
*/
this.off = this.removeListener;
this.listeners = {};
}
/**
* Add event listener
*/
addListener(eventName, listener) {
const listeners = this.listeners[eventName];
if (listeners) {
listeners.push(listener);
}
else {
this.listeners[eventName] = [listener];
}
return this;
}
/**
* Remove event listener
*/
removeListener(eventName, listener) {
const listeners = this.listeners[eventName];
if (listeners) {
const start = listeners.indexOf(listener);
if (start > -1) {
listeners.splice(start, 1);
}
}
return this;
}
/**
* Removes all listeners, or those of the specified eventName
*/
removeAllListeners(eventName) {
delete this.listeners[eventName];
}
/**
* Call listener once, removed after call
*/
once(eventName, listener) {
const cb = (...args) => {
listener(...args);
setTimeout(() => {
this.removeListener(eventName, cb);
}, 0);
};
this.addListener(eventName, cb);
return this;
}
/**
* Adds the listener function to the beginning of the listeners array for the event named eventName
*/
prependListener(eventName, listener) {
const listeners = this.listeners[eventName];
if (listeners) {
listeners.unshift(listener);
}
else {
this.listeners[eventName] = [listener];
}
...