DOM и React Senior Компоненты на практике обновлено

Сетка месяца

Условие

Календарь на месяц. Требования: · заголовок <span class="title"> вида «2026-09»; · <button class="prev"> и <button class="next"> листают месяцы; · дни - <button class="day" data-date="ГГГГ-ММ-ДД">, ровно столько, сколько дней в месяце; · перед первым днём - <span class="pad"> по числу пустых клеток, неделя начинается с понедельника; · клик по дню вызывает onSelect(строка даты), выбранный получает класс "on"; · текущий выбранный день приходит пропсом value.

Что проверяют тесты

  • правильное число дней

  • февраль високосного года

  • февраль обычного года

  • отступ до первого дня, неделя с понедельника

  • листает вперёд через границу года

  • листает назад через границу года

  • выбор сообщает наружу

  • выбранный подсвечен

Как подойти

Задача целиком про календарную арифметику и её ловушки. new Date(год, месяц, 0) сам знает про високосные годы - писать правило руками не нужно. Сдвиг (день + 6) % 7 превращает воскресную неделю в понедельничную. Границы года получаются бесплатно, если доверить нормализацию конструктору Date: new Date(2026, 12, 1) даст январь 2027. Что назвать вслух: часовые пояса (всю работу вести в локальной дате или в UTC, но не смешивать), диапазон дат, недоступные дни, локализованные названия через Intl.

Подсказки: 3
  1. Число дней месяца: new Date(год, месяц, 0).getDate() - нулевой день следующего месяца.
  2. getDay возвращает 0 для воскресенья - для недели с понедельника нужен сдвиг.
  3. Переход через границу года получится сам, если строить дату конструктором, а не арифметикой над числом месяца.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.