TGViewer
<divelopers> <divelopers> @alexnozer_dev · 1.18K subscribers
Post #407 415
Подклассы Event вместо CustomEvent

Многие библиотеки предоставляют систему событий в качестве публичного API. Потребители могут подписываться на них и изменять поведение. Часто основой для событий служит класс CustomEvent, у которого в detail могут быть данные.

// Где-то в коде компонента
component.dispatchEvent(
new CustomEvent(
'quantity-change',
{
detail: {
newValue,
oldValue
}
}
)
);

Нет ничего плохого в использовании CustomEvent. Исторически он существует, потому что для авторов библиотек нужен был механизм пользовательских событий, а наследование от встроенных классов до появления ES6 не поддерживалось.

При работе с CustomEvent нужно помнить, что полезная нагрузка события находится в свойстве detail. Нужен дополнительный шаг в цепочке доступа к свойству объекта или деструктуризация, что не очень удобно с точки зрения DX.

component.addEventListener(
'quantity-change',
(e) => {
// чтение из detail
const newValue = e.detail.newValue;
const oldValue = e.detail.oldValue;

// или деструктуризация
const {
newValue,
oldValue
} = e.detail;
}
);

Если событие не предполагает полезной нагрузки и служит только для оповещения, то достаточно обычного объекта Event. Его конструктор принимает тип (имя) и объект с параметрами события (bubbles, cancelable, composed).

У Event есть встроенные подкласы. Среди них, например, ErrorEvent, ToggleEvent или PointerEvent. Если семантика какого-то встроенного события подходит цели, то можно использовать соответствующий встроенный подкласс Event.

Если же событие подразумевает полезную нагрузку, то вместо CustomEvent можно использовать собственный подкласс Event. Так как это обычный класс, можно объявить произвольные поля экземпляра, без промежуточного detail.

class QuantityChangeEvent extends Event {
static eventName = 'quantity-change';

newValue;
oldValue;

constructor(newValue, oldValue) {
super(QuantityChangeEvent.eventName);
this.newValue = newValue;
this.oldValue = oldValue;
}
}

// Где-то в коде компонента
component.dispatchEvent(
new QuantityChangeEvent(
newValue,
oldValue
)
);

Также для собственных подклассов Event с произвольными данными проще описать типы, чем для CustomEvent. Особенности типизации CustomEvent подробно описал Бартон Смит в статье Creating Strongly Typed Events for Web Components.

Больше деталей про использование Event можно найти в статьях от Джастина Фагнани и Бартона Смита:

- Stop Using CustomEvent;
- Creating Truly Custom Events for Web Components.

#js #web_api
  • ❤ 8
  • 👎 2
  • 🤝 1
More from @alexnozer_dev
  1. Sep 21, 2026Реализация пользовательских атрибутов Под конец прошлого года я рассказывал об API пользов…
  2. Sep 11, 2026Эволюция стилей в темах Shopify Адам Ватан на днях поделился новостью, что Shopify выкупил…
  3. Sep 9, 2026Persistent Widgets Многие сайты не должны быть SPA. Но иногда эта архитектура продиктована…
  4. Sep 7, 2026Processing Instructions и маркеры В DOM всё представлено в виде узлов (Node) разных типов.…
  5. Sep 1, 2026@scope и потоковая передача HTML Ноам Розенталь поделился интересной техникой, в которой с…
  6. Aug 26, 2026Не стоит полагаться на User Agent User Agent sniffing — это техника поиска в строке User A…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →