Отдельные циклы для чисел за текущий и предыдущий месяцы (кстати, а где у вас следующий?) не нужны. Чтобы получить число, надо не на счётчик цикла смотреть, а на дату - начальным значением будет первое число месяца минус количество дней, прошедших с последнего понедельника предыдущего месяца. Цикл крутить надо не до конца месяца, а немного дальше - чтобы общее количество чисел было кратно семи (т.е., чтобы в последней неделе не было отсутствующих дней) и всегда одно и то же (чтобы размер календаря не зависел от отображаемого месяца).
Вот так:
const month = computed(() => {
const today = new Date().setHours(0, 0, 0, 0);
const m = date.value.getMonth();
const d = new Date(date.value.getFullYear(), m, 0);
d.setDate(d.getDate() - (d.getDay() || 7));
return Array.from({ length: 42 }, () => (
d.setDate(d.getDate() + 1),
{
date: d.getDate(),
currMonth: d.getMonth() === m,
today: +d === today,
}
));
});
<div class="calendar">
<div
v-for="n in weekdays"
v-text="n"
class="weekday"
></div>
<div
v-for="{ date, ...n } in month"
v-text="date"
:class="[ 'day', n ]"
></div>
</div>
.calendar {
display: grid;
grid-template-columns: repeat(7, 1fr);
}