Даже не знаю как коротко объяснить. Тут скорее важно понимать зачем вообще события нужны.
Представь, что есть приложение состоящее из нескольких модулей. В нем должны быть кнопки. У кнопки может быть состояние «pressed» когда она нажата и должна быть возможность реагировать на это состояние.
Чтобы это реализовать нужно подписаться на события: mousedown, focusin, focusout, keypress и т.д.
И придется либо вынести обработку этих событий на уровень приложения, и размещать все обработчики из разных модулей в одном месте. А это свяжет код. Либо растаскивать знание о том как обрабатывать для кнопки события mousedown, focusin и т.д. по всем модулям.
А с кастомными событиями вся логика обработки mousedown, focusin и т.д. будет внутри кнопки. Внешние компоненты будут знать только то, что можно подписаться на событие «custom:pressed». Причем не важно откуда оно появилось, и на уровне приложения можно будет добавить логику горячих клавиш, сгенерировать такое же событие и все продолжит работать.
Одни плюсы: вся логика находится там где и должна, код слабо связан, можно расширить поведение и не нужно изобретать никаких костылей