使用 Vue 3 框架编写的简单日历组件

简介: 使用 Vue 3 框架编写的简单日历组件

这段代码是一个使用 Vue 3 框架编写的简单日历组件。下面是代码的详细解析:

  1. 模板部分(Template)
  • 定义了一个名为 "calendar" 的 div,它包含了一个头部分(header)和三个主要部分:一周的日期(days-of-week)、所有日期(dates)和一个按钮组。
  • 在 "header" 部分,显示了当前的年和月,以及两个按钮,一个用于显示上个月,另一个用于显示下个月。
  • "days-of-week" 部分显示了一周的七天。
  • "dates" 部分显示了该月的所有日期。使用 v-for 指令来循环遍历 dates 数组,并显示每个日期的天数。同时,使用 :class 绑定来为当前月份以外的日期添加一个特定的 CSS 类("not-current-month")。
  1. 脚本部分(Script)
  • 使用 import { ref, computed } from 'vue' 导入了 Vue 的响应式引用(ref)和计算属性(computed)。
  • 定义了四个响应式引用:yearmonthdaysOfWeekdates
  • yearmonth 引用了当前年份和月份。
  • daysOfWeek 是一个包含一周七天的数组。
  • dates 是一个计算属性,它首先获取当前月份的第一天是星期几,然后确定这个月有多少天,并创建一个包含所有这些日期的数组。然后,它使用 Array.prototype.fill() 方法填充数组中的前几项,这些项对应于一周的前几天(例如,如果一周的第一天是星期日,那么数组的前一项将是空对象)。
  • previousMonthnextMonth 函数分别用于显示上个月和下个月的日历。这些函数通过修改 yearmonth 的值来实现。
  1. 样式部分(Style)
  • 在这里可以添加你的样式代码,以定制日历的外观。由于此代码示例中没有提供样式部分,因此默认情况下它将使用 Vue 的内置样式或任何全局样式表中的样式。

总的来说,这是一个功能齐全的、可响应的、用户可操作的日历组件

代码部分

<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>
相关文章
|
3月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
324 2
|
2月前
|
JavaScript 前端开发 安全
Vue 3
Vue 3以组合式API、Proxy响应式系统和全面TypeScript支持,重构前端开发范式。性能优化与生态协同并进,兼顾易用性与工程化,引领Web开发迈向高效、可维护的新纪元。(238字)
526 139
|
2月前
|
缓存 JavaScript 算法
Vue 3性能优化
Vue 3 通过 Proxy 和编译优化提升性能,但仍需遵循最佳实践。合理使用 v-if、key、computed,避免深度监听,利用懒加载与虚拟列表,结合打包优化,方可充分发挥其性能优势。(239字)
241 1
|
6月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
813 0
|
3月前
|
开发工具 iOS开发 MacOS
基于Vite7.1+Vue3+Pinia3+ArcoDesign网页版webos后台模板
最新版研发vite7+vue3.5+pinia3+arco-design仿macos/windows风格网页版OS系统Vite-Vue3-WebOS。
406 11
|
2月前
|
JavaScript 安全
vue3使用ts传参教程
Vue 3结合TypeScript实现组件传参,提升类型安全与开发效率。涵盖Props、Emits、v-model双向绑定及useAttrs透传属性,建议明确声明类型,保障代码质量。
276 0
|
6月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
4月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
457 1
|
4月前
|
缓存 JavaScript UED
除了循环引用,Vue3还有哪些常见的性能优化技巧?
除了循环引用,Vue3还有哪些常见的性能优化技巧?
271 0
|
5月前
|
JavaScript
vue3循环引用自已实现
当渲染大量数据列表时,使用虚拟列表只渲染可视区域的内容,显著减少 DOM 节点数量。
142 0