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组件即可。

相关推荐
sunly_13 分钟前
Flutter:自定义Tab切换,订单列表页tab,tab吸顶
开发语言·javascript·flutter
Zero_pl26 分钟前
vue学习路线
vue.js
咔咔库奇32 分钟前
【TypeScript】命名空间、模块、声明文件
前端·javascript·typescript
NoneCoder34 分钟前
JavaScript系列(42)--路由系统实现详解
开发语言·javascript·网络
2013crazy1 小时前
Java 基于 SpringBoot+Vue 的校园兼职平台(附源码、部署、文档)
java·vue.js·spring boot·兼职平台·校园兼职·兼职发布平台
兩尛1 小时前
订单状态定时处理、来单提醒和客户催单(day10)
java·前端·数据库
又迷茫了1 小时前
vue + element-ui 组件样式缺失导致没有效果
前端·javascript·vue.js
哇哦Q1 小时前
原生HTML集合
前端·javascript·html
SoWhat~1 小时前
随遇随记篇
前端·javascript
孟健1 小时前
重磅首发:国产AI编程助手Trae实测!免费用上Claude是什么体验?
前端·aigc·visual studio code