Skip to main content

Custom Events

Custom Events Utility Class

class CustomEvents {
constructor() {
this.events = {};
}

/**
* Add an event listener
* @param {string} eventName - Name of the event
* @param {function} callback - Callback to execute when the event is triggered
*/
on(eventName, callback) {
if (!this.events[eventName]) {
this.events[eventName] = [];
}
this.events[eventName].push(callback);
}

/**
* Remove an event listener
* @param {string} eventName - Name of the event
* @param {function} callback - Callback to remove
*/
off(eventName, callback) {
if (!this.events[eventName]) return;
this.events[eventName] = this.events[eventName].filter(cb => cb !== callback);
}

/**
* Dispatch an event
* @param {string} eventName - Name of the event
* @param {any} data - Data to pass to the listeners
*/
dispatch(eventName, data) {
if (!this.events[eventName]) return;
this.events[eventName].forEach(callback => callback(data));
}
}

// Create a shared instance
const customEvents = new CustomEvents();
export default customEvents;

Usage Example in React

Step 1: Dispatch Events :

  • You can dispatch custom events from any component.
import React from 'react';
import customEvents from './CustomEvents';

const EventDispatcher = () => {
const handleClick = () => {
customEvents.dispatch('custom-event', { message: 'Hello from EventDispatcher!' });
};

return (
<button onClick={handleClick}>Dispatch Custom Event</button>
);
};

export default EventDispatcher;

Step 2: Listen to Events :

import React, { useEffect, useState } from 'react';
import customEvents from './CustomEvents';

const EventListener = () => {
const [eventData, setEventData] = useState(null);

useEffect(() => {
const handleEvent = data => {
setEventData(data.message);
};

customEvents.on('custom-event', handleEvent);

// Clean up on unmount
return () => {
customEvents.off('custom-event', handleEvent);
};
}, []);

return (
<div>
<h3>Event Data: {eventData}</h3>
</div>
);
};

export default EventListener;