Не очень удачно, что таймеры часто обновляют содержание страницы, по сути ничего не меняя – текст остаётся тот же большую часть срабатываний.
Один вариант — использовать Shadow DOM, можно с React или Vue – те берут на себя задачу обновления реальной DOM только фактически изменившимися участками. Но освоение нового инструмента займёт какое-то время.
Другой вариант – использовать события. Что-то меняется только когда впервые наступает момет «Че». Например, время
08:40
. В этот момент можно выбросить событие. Считайте, что «Событие» == «Звонок».
Слушать это событие будет каждый компонент урока. И менять своё состояние, если время – его.
Как я понимаю, там ещё обычные часы должны тикать. Вот в них же можно отслеживать моменты, когда из
08:39
стало
08:40
– предыдущее значение ещё-не, а текущее уже-да. Вот тогда и выбрасывать
событие.
У компонента урока может быть одно из трёх состояний: "Upcoming", "Ongoing", "Completed". В обработчике события можно принимать решение, какое из трёх переключиться, исходя из времени события и собственных отметок времени начала и конца.