JSFiddle - React, Tailwind, and code Playground

JavaScript

CustomEventTarget.prototype = {
	
	'constructor': CustomEventTarget,
	
	on:   function( ev, el ) { this.eventTarget.addEventListener( ev, el ) },
	off:  function( ev, el ) { this.eventTarget.removeEventListener( ev, el ) },
	emit: function( ev ) { this.eventTarget.dispatchEvent( ev ) }
	
}

function CustomEventTarget() { this.eventTarget = new EventTarget }


// Usage

var iSubmit = new CustomEventTarget()

iSubmit.test = function( memo ) {
  const detail = { memo: memo }
  setTimeout( emit, 1000 )
  function emit() {
  	iSubmit.emit( new CustomEvent( 'test', { detail: detail } ) )
  }
}

iSubmit.on( 'test', function( e ) {
  console.log( e )
  document.body.innerHTML = e.detail.memo
})

document.body.innerHTML = 'dispatching event...'
iSubmit.test( 'memo text' )