这段代码是一个使用 Vue 3 框架编写的简单日历组件。下面是代码的详细解析:
模板部分(Template):
v-for
?指令来循环遍历?dates
?数组,并显示每个日期的天数。同时,使用?:class
?绑定来为当前月份以外的日期添加一个特定的 CSS 类("not-current-month")。脚本部分(Script):
import { ref, computed } from 'vue'
?导入了 Vue 的响应式引用(ref)和计算属性(computed)。year
、month
、daysOfWeek
?和?dates
。year
?和?month
?引用了当前年份和月份。daysOfWeek
?是一个包含一周七天的数组。dates
?是一个计算属性,它首先获取当前月份的第一天是星期几,然后确定这个月有多少天,并创建一个包含所有这些日期的数组。然后,它使用?Array.prototype.fill()
?方法填充数组中的前几项,这些项对应于一周的前几天(例如,如果一周的第一天是星期日,那么数组的前一项将是空对象)。previousMonth
?和?nextMonth
?函数分别用于显示上个月和下个月的日历。这些函数通过修改?year
?和?month
?的值来实现。样式部分(Style):
总的来说,这是一个功能齐全的、可响应的、用户可操作的日历组件
代码部分
<template>
<div class="calendar">
<div class="header">
<span>{{ year }} 年 {{ month + 1 }} 月</span>
<button @click="previousMonth">上个月</button>
<button @click="nextMonth">下个月</button>
</div>
<div class="days-of-week">
<span v-for="day in daysOfWeek" :key="day">{{ day }}</span>
</div>
<div class="dates">
<span
v-for="(date, index) in dates"
:key="index"
:class="{ 'not-current-month': date.month !== month }"
>
{{ date.day }}
</span>
</div>
</div>
</template>
<script setup>
import { ref, computed } from 'vue';
const year = ref(new Date().getFullYear());
const month = ref(new Date().getMonth());
const daysOfWeek = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
const dates = computed(() => {
const firstDayOfMonth = new Date(year.value, month.value, 1).getDay();
const totalDaysInMonth = new Date(year.value, month.value + 1, 0).getDate();
const datesArray = [];
for (let i = 1; i <= totalDaysInMonth; i++) {
datesArray.push({ day: i, month: month.value });
}
return [
...Array(firstDayOfMonth).fill({ day: '', month: '' }),
...datesArray,
];
});
function previousMonth() {
if (month.value === 0) {
year.value--;
month.value = 11;
} else {
month.value--;
}
}
function nextMonth() {
if (month.value === 11) {
year.value++;
month.value = 0;
} else {
month.value++;
}
}
</script>
<style scoped>
/* Add your styles here */
</style>