Можно слушать события клика выше в дереве, на общем родителе. Да хоть на document, как в примере.
Это называется «делегирование событий» — мы поручаем обработку событий не каждой кнопке по отдельности, а общему предку.
Из события клика сразу вытаскивать
event.target
– это кликнутый элемент.
Проверять, кнопка ли это вообще, и есть ли нужный класс. Т.к. ловиться будут вообще все клики в документе.
document.addEventListener('click', ({ target }) => {
if (!target.classList.contains('button')) return; // не тот клик
target.classList.toggle('active');
});