当前位置:首页 > VUE

vue实现日历功能

2026-02-19 14:36:15VUE

基础日历实现

使用Vue实现基础日历功能需要结合日期计算和组件化思想。创建日历组件时,需处理年、月切换并渲染日期格子。

安装依赖(如需要):

npm install date-fns  # 推荐日期处理库

日历组件模板部分:

<template>
  <div class="calendar">
    <div class="header">
      <button @click="prevMonth">上个月</button>
      <span>{{ currentYear }}年{{ currentMonth }}月</span>
      <button @click="nextMonth">下个月</button>
    </div>
    <div class="weekdays">
      <div v-for="day in weekdays" :key="day">{{ day }}</div>
    </div>
    <div class="days">
      <div 
        v-for="(day, index) in days" 
        :key="index"
        :class="{ 'other-month': !day.isCurrentMonth, 'today': day.isToday }"
      >
        {{ day.date }}
      </div>
    </div>
  </div>
</template>

日期数据处理

在Vue组件的script部分处理日期逻辑:

import { format, startOfMonth, endOfMonth, eachDayOfInterval, isSameMonth, isToday } from 'date-fns'

export default {
  data() {
    return {
      currentDate: new Date(),
      weekdays: ['日', '一', '二', '三', '四', '五', '六']
    }
  },
  computed: {
    currentYear() {
      return format(this.currentDate, 'yyyy')
    },
    currentMonth() {
      return format(this.currentDate, 'MM')
    },
    days() {
      const start = startOfMonth(this.currentDate)
      const end = endOfMonth(this.currentDate)
      const daysArray = eachDayOfInterval({ start, end })

      return daysArray.map(day => ({
        date: format(day, 'd'),
        isCurrentMonth: isSameMonth(day, this.currentDate),
        isToday: isToday(day),
        fullDate: day
      }))
    }
  },
  methods: {
    prevMonth() {
      this.currentDate = new Date(this.currentDate.getFullYear(), this.currentDate.getMonth() - 1, 1)
    },
    nextMonth() {
      this.currentDate = new Date(this.currentDate.getFullYear(), this.currentDate.getMonth() + 1, 1)
    }
  }
}

样式设计

基础日历样式可参考以下CSS:

.calendar {
  width: 350px;
  font-family: Arial;
}

.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 10px;
}

.weekdays, .days {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
}

.weekdays div {
  padding: 10px;
  text-align: center;
  font-weight: bold;
}

.days div {
  padding: 10px;
  height: 40px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid #eee;
}

.other-month {
  color: #ccc;
}

.today {
  background-color: #4285f4;
  color: white;
  border-radius: 50%;
}

进阶功能实现

事件标记功能

// 在data中添加
events: [
  { date: '2023-06-15', title: '会议' },
  { date: '2023-06-20', title: '生日' }
]

// 修改days计算属性
days() {
  // ...原有代码
  return daysArray.map(day => {
    const formattedDate = format(day, 'yyyy-MM-dd')
    return {
      // ...原有属性
      hasEvent: this.events.some(event => event.date === formattedDate)
    }
  })
}

模板中添加事件标记

<div class="day-content">
  {{ day.date }}
  <span v-if="day.hasEvent" class="event-dot"></span>
</div>

添加点击事件

<div @click="selectDay(day)">...</div>

methods: {
  selectDay(day) {
    this.selectedDate = day.fullDate
    // 可以触发自定义事件或显示模态框
  }
}

第三方库方案

使用现成的Vue日历组件库可以快速实现复杂功能:

  1. 安装vue-cal:

    npm install vue-cal
  2. 基本使用:

    
    import VueCal from 'vue-cal'
    import 'vue-cal/dist/vuecal.css'

export default { components: { VueCal }, data() { return { events: [ { start: '2023-06-15 10:00', end: '2023-06-15 12:00', title: '会议' } ] } } }


```html
<vue-cal
  :time="false"
  :events="events"
  active-view="month"
/>

以上方案提供了从零实现和快速集成两种路径,可根据项目复杂度选择适合的方式。自定义实现更适合需要高度定制化的场景,而第三方库适合快速开发标准日历功能。

vue实现日历功能

标签: 日历功能
分享给朋友:

相关文章

vue实现功能

vue实现功能

Vue 功能实现方法 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是实现常见功能的几种方法: 数据绑定与响应式更新 在 Vue 中,数据绑定通过 v-mode…

vue日历实现

vue日历实现

实现基础日历布局 使用Vue的模板语法构建日历的基本HTML结构。一个典型的日历包含星期标题和日期格子,可以通过v-for循环生成。月份切换功能通过计算属性动态更新日期数组。 <templa…

vue实现考试多选功能

vue实现考试多选功能

Vue实现考试多选功能 数据绑定与选项渲染 使用v-model绑定用户选择的答案数组,结合v-for循环渲染选项列表。示例代码: <template> <div>…

vue实现倍速播放功能

vue实现倍速播放功能

实现倍速播放功能的方法 在Vue中实现倍速播放功能通常涉及HTML5的<video>元素或第三方播放器库(如video.js)的API调用。以下是具体实现方式: 使用原生HTML5…

前端实现拖拽功能vue

前端实现拖拽功能vue

使用 HTML5 拖放 API 在 Vue 中可以通过 HTML5 的原生拖放 API 实现拖拽功能。需要监听 dragstart、dragover 和 drop 事件。 <template…

vue实现收货功能

vue实现收货功能

实现收货功能的基本思路 在Vue中实现收货功能通常涉及前端界面交互、后端API调用以及状态管理。以下是关键步骤和代码示例: 页面布局与数据绑定 使用Vue的模板语法构建收货表单,包含收货人、联系方式…