vue创建一个日历组件

首先,在Vue项目中创建一个日历组件所需要的Vue单文件组件(.vue文件)。

在template标签中,可以使用table和tr标签来创建一个简单的日历表格,使用v-for指令来循环渲染每一行日期。

在script标签中:

  1. 使用moment.js库来处理日期时间,这个库非常方便,可以安装moment.js并引入。
  2. 设置当前月份和年份以及当前日期,使用计算属性computed来根据当前月份和年份计算出日历中的日期和周几。
  3. 在methods中,封装一个方法handlePrevMonth和handleNextMonth来控制上一个月和下一个月的切换。

最后,在style标签中,可以设置样式来美化日历组件。

这样,就可以创建一个基本的Vue日历组件了。具体实现可以看下面的代码:

vue 复制代码
<template>
  <div class="calendar">
    <table>
      <thead>
        <tr>
          <th colspan="7">{{ currentMonth }} {{ currentYear }}</th>
        </tr>
        <tr>
          <th v-for="day in days">{{ day }}</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="week in weeks" :key="week">
          <td v-for="day in week" :class="{ 'today': isToday(day), 'different-month': !isCurrentMonth(day) }">{{ day.format('D') }}</td>
        </tr>
      </tbody>
    </table>
  </div>
</template>

<script>
import moment from 'moment';

export default {
  name: 'Calendar',
  data() {
    return {
      currentDate: moment(),
    };
  },
  computed: {
    currentMonth() {
      return this.currentDate.format('MMMM');
    },
    currentYear() {
      return this.currentDate.format('YYYY');
    },
    days() {
      return ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
    },
    weeks() {
      const weeks = [];
      const date = this.currentDate.clone().startOf('month').startOf('week');
      do {
        const week = [];
        for (let i = 0; i < 7; i++) {
          week.push(date.clone());
          date.add(1, 'day');
        }
        weeks.push(week);
      } while (date.month() === this.currentDate.month());
      return weeks;
    },
  },
  methods: {
    isToday(date) {
      return moment().isSame(moment(date), 'day');
    },
    isCurrentMonth(date) {
      return moment(date).isSame(this.currentDate, 'month');
    },
    handlePrevMonth() {
      this.currentDate.subtract(1, 'month');
    },
    handleNextMonth() {
      this.currentDate.add(1, 'month');
    },
  },
};
</script>

<style scoped>
.calendar {
  margin: 20px;
}

table {
  border-collapse: collapse;
  width: 100%;
  max-width: 600px;
}

th,
td {
  text-align: center;
  padding: 10px;
  border: 1px solid #ddd;
}

.weekend {
  color: red;
}

.today {
  background-color: #f5f5f5;
}

.different-month {
  color: #ddd;
}
</style>

然后在页面中引入Calendar组件即可。

相关推荐
道可到1 天前
程序员养生十大违章:你中了几条?
前端·后端·面试
Guo_Pian1 天前
vite核心原理
前端·架构
斜向生1 天前
【JavaScript正则表达式指南】——正则表达式入门:创建、方法与标志详解
前端
朕的剑还未配妥1 天前
Vue2函数式组件实战:手写可调用的动态组件,适用于toast轻提示、tip提示、dialog弹窗等
前端
这可不简单1 天前
前端性能优化:从浏览器渲染原理到实战(告别 “知其然不知其所以然”)
前端·css·面试
前端开发爱好者1 天前
尤雨溪宣布:Vite 纪录片震撼发布!
前端·javascript·vue.js
北城以北88881 天前
ES6(二)
前端·javascript·es6
科兴第一吴彦祖1 天前
基于Spring Boot + Vue 3的乡村振兴综合服务平台
java·vue.js·人工智能·spring boot·推荐算法
朕的剑还未配妥1 天前
移动端触摸事件与鼠标事件的触发机制详解
前端
墨鱼鱼1 天前
【征文计划】Rokid JSAR 实践指南:打造沉浸式 "声动空间盒" 交互体验
前端