当前位置:首页 > VUE

vue实现全年日历

2026-01-14 01:26:08VUE

实现全年日历的基本思路

使用Vue实现全年日历需要结合日期计算、数据渲染和交互逻辑。核心在于生成全年12个月的日历数据,并通过组件化方式展示。以下是具体实现方法:

安装依赖(可选)

如需更便捷的日期处理,可安装dayjsdate-fns

npm install dayjs

基础组件结构

创建日历组件YearCalendar.vue

<template>
  <div class="year-calendar">
    <div v-for="month in months" :key="month.month" class="month-container">
      <h3>{{ month.monthName }} {{ year }}</h3>
      <div class="calendar-grid">
        <div v-for="day in month.days" :key="day.date" 
             class="day-cell" :class="{ 'other-month': !day.isCurrentMonth }">
          {{ day.day }}
        </div>
      </div>
    </div>
  </div>
</template>

核心逻辑实现

import { ref, computed } from 'vue';
import dayjs from 'dayjs';

export default {
  setup() {
    const year = ref(new Date().getFullYear());

    const months = computed(() => {
      return Array.from({ length: 12 }, (_, i) => {
        const monthStart = dayjs(`${year.value}-${i+1}-01`);
        const monthName = monthStart.format('MMMM');
        const daysInMonth = monthStart.daysInMonth();
        const firstDayOfWeek = monthStart.day();

        // 生成当月天数数组
        const days = [];

        // 填充上月剩余天数
        const prevMonthDays = firstDayOfWeek;
        for (let j = prevMonthDays - 1; j >= 0; j--) {
          days.push({
            day: monthStart.subtract(j + 1, 'day').date(),
            date: monthStart.subtract(j + 1, 'day').format('YYYY-MM-DD'),
            isCurrentMonth: false
          });
        }

        // 填充当月天数
        for (let d = 1; d <= daysInMonth; d++) {
          days.push({
            day: d,
            date: monthStart.date(d).format('YYYY-MM-DD'),
            isCurrentMonth: true
          });
        }

        // 填充下月天数(补齐6行)
        const remainingCells = 42 - days.length; // 6行x7天
        for (let k = 1; k <= remainingCells; k++) {
          days.push({
            day: k,
            date: monthStart.add(daysInMonth + k, 'day').format('YYYY-MM-DD'),
            isCurrentMonth: false
          });
        }

        return { month: i + 1, monthName, days };
      });
    });

    return { year, months };
  }
};

样式设计

.year-calendar {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 20px;
}

.month-container {
  background: white;
  padding: 10px;
  border-radius: 8px;
  box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}

.calendar-grid {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 5px;
}

.day-cell {
  padding: 5px;
  text-align: center;
  border-radius: 4px;
}

.day-cell.other-month {
  opacity: 0.3;
}

h3 {
  text-align: center;
  margin-bottom: 10px;
}

高级功能扩展

年份切换

<template>
  <div>
    <button @click="year--">←</button>
    <span>{{ year }}</span>
    <button @click="year++">→</button>
    <YearCalendar :year="year" />
  </div>
</template>

事件标记 在日历数据生成时添加事件检测:

days.push({
  day: d,
  date: dateStr,
  isCurrentMonth: true,
  hasEvent: events.value.some(e => e.date === dateStr)
});

性能优化建议

对于大型年份范围,可采用虚拟滚动技术。使用vue-virtual-scroller等库优化渲染:

<RecycleScroller
  :items="months"
  :item-size="300"
  key-field="month"
  v-slot="{ item }">
  <MonthCalendar :month="item" />
</RecycleScroller>

完整示例整合

最终实现应包含:

  • 年份导航控制
  • 12个月网格布局
  • 跨月日期显示(灰色)
  • 可选的事件标记功能
  • 响应式设计适配不同屏幕

通过组合式API和计算属性,可以高效生成日历数据。Dayjs等库简化了日期计算,组件化设计便于功能扩展。

vue实现全年日历

标签: 全年日历
分享给朋友:

相关文章

Vue实现日历日程

Vue实现日历日程

Vue 实现日历日程 使用第三方库(如 FullCalendar) FullCalendar 是一个功能强大的日历库,支持 Vue 集成。安装依赖: npm install @fullcalen…

vue实现日历人员值班

vue实现日历人员值班

实现日历人员值班功能 日历人员值班功能可以通过Vue结合第三方日历组件或自定义实现。以下是一种基于FullCalendar的实现方案。 安装依赖 需要安装@fullcalendar/vue及相关插…

vue实现每日签到日历

vue实现每日签到日历

实现每日签到日历的基本思路 使用Vue实现每日签到日历需要结合日期处理和组件化设计。核心功能包括生成当月日历数据、标记签到状态以及交互逻辑。 日历数据生成 通过JavaScript的Date对象处理…

vue实现iview日历显示

vue实现iview日历显示

实现步骤 安装必要的依赖库iview和vue。通过npm或yarn进行安装: npm install iview vue 在main.js中引入iview并注册组件: import Vue fro…

react实现携程日历

react实现携程日历

实现携程日历的React组件 创建一个类似携程的日历组件需要处理日期选择、区间高亮、禁用日期等逻辑。以下是关键实现步骤: 日期选择与区间高亮 使用date-fns库处理日期操作,实现开始/结束日期选…

react实现日历

react实现日历

使用 React 实现日历 日历组件在 Web 应用中常用于日期选择、事件展示等场景。以下是几种实现日历的常见方法: 使用第三方库(如 react-calendar) 安装 react-calen…