я понимаю что есть более правильный подход но не могу найти
Как вариант:
1. Вешаем слушатель событий на документ или родителя этих табов
2. Всем табам даем одинаковый класс
3. Проверяем попал ли таргет на таб
4. Всем убираем класс open
5. Тому, который в таргете задаем его
const CLASS_TAB = 'tab';
const CLASS_OPEN = 'open';
const block = document.querySelector('.block'); // родительский блок табов
const tabs = block.querySelectorAll(`.${CLASS_TAB}`);
block.addEventListener('click', ({target}) => {
const tab = target.closest(`.${CLASS_TAB}`);
if (tab) {
tabs.forEach((item) => {
item.classList.remove(CLASS_OPEN);
});
tab.classList.add(CLASS_OPEN);
}
});
Условие тоже можно перезаписать компактнее, но мне кажется у вас вопрос как раз в логике кода, а не в сокращении символов.
На что-то такое
if (tab) tabs.forEach(t => t.classList.toggle('open', t === tab));
Когда дойдёте до задачи, когда нужно менять класс не самой кнопке-табу, а соответствующему блоку с контентом, то:
- Почитайте про DOM дерево, поиск родителей, соседей и т.д.
- Так же рекомендую использовать data-атрибуты для связи элементов.