vue2 + moment 实现日历,并带有上个月和下个月日期的日历

在 Vue 2 中使用 moment 库绘制一个带有上个月和下个月日期的日历,可以通过以下步骤实现。这个日历将显示当前月份的天数,以及前一个月和下一个月的部分日期(通常为了让日历对齐为6行,每行7天)。

主要步骤:

  1. 生成当前月份的所有天数。
  2. 计算上个月的剩余天数(即填充当前月份开始前的日期)。
  3. 计算下个月的天数(即填充当前月份结束后的日期,直到日历的最后一天)

实现效果

在这里插入图片描述

代码实现

  1. 安装 moment
    首先,确保已经安装 moment 库:
npm install moment
  1. 在 Vue 组件中绘制日历
<template><div class="calendar"><div class="calendar-top flex"><div class="calendar-top-same"><div>{{ month.format("YYYY年MM月") }}</div></div><el-button @click="prevMonth" size="mini">上个月</el-button><el-button @click="currentMonth" size="mini">今天</el-button><el-button @click="nextMonth" size="mini">下个月</el-button></div><div class="calendar-body"><div v-for="item in weekdays" :key="item" class="calendar-body-week">{{ item }}</div><divv-for="(day, index) in days":key="index"class="calendar-body-day":class="{dis: day.isPrevMonth||day.isNextMonth,today:today===day.date.format('YYYY-MM-DD')}"@click="handleClickDay(day)">{{ day.date.date() }}</div></div></div>
</template><script>
import moment from "moment";
export default {name: "calendar",props: {// 日期date: {type: Date,default() {return new Date();},},},data() {return {today: '', // 选中的日期month: moment(), // 当前月份weekdays: ["日", "一", "二", "三", "四", "五", "六"], // 星期days: [], // 存储当前日历显示的天数};},mounted() {this.today = moment(this.date).format("YYYY-MM-DD");this.generateCalendar();},methods: {// 生成日历generateCalendar() {this.days = [];// 获取当前月份的开始和结束日期const startOfMonth = this.month.clone().startOf("month");const endOfMonth = this.month.clone().endOf("month");// 获取上个月需要显示的天数const startWeekday = startOfMonth.day();const prevMonthDays = [];if (startWeekday > 0) {const prevMonthEnd = startOfMonth.clone().subtract(1, "month").endOf("month");for (let i = startWeekday - 1; i >= 0; i--) {prevMonthDays.push({date: prevMonthEnd.clone().subtract(i, "days"),isPrevMonth: true,});}}// 获取当前月份的所有天数const currentMonthDays = [];for (let i = 0; i < endOfMonth.date(); i++) {currentMonthDays.push({date: startOfMonth.clone().add(i, "days"),isPrevMonth: false,isNextMonth: false,// 是否为今天isToday: startOfMonth.clone().add(i, "days").isSame(moment(), "day"),// 是否为今天之后的日期 不含今天isAfterToday: startOfMonth.clone().add(i, "days").isAfter(moment(),"day",)});}// 获取下个月需要显示的天数const endWeekday = endOfMonth.day();const nextMonthDays = [];if (endWeekday < 6) {for (let i = 1; i <= 6 - endWeekday; i++) {nextMonthDays.push({date: endOfMonth.clone().add(i, "days"),isNextMonth: true,isAfterToday: endOfMonth.clone().add(i, "days").isAfter(moment(),"day",)});}}// 合并上个月、当前月份、下个月的天数this.days = [...prevMonthDays, ...currentMonthDays, ...nextMonthDays];},// 切换到上个月prevMonth() {this.month = this.month.clone().subtract(1, "month");this.generateCalendar();},// 切换到当前月份currentMonth() {this.today = moment().format("YYYY-MM-DD");this.month = moment();this.generateCalendar();this.$emit("change",this.today)},// 切换到下个月nextMonth() {this.month = this.month.clone().add(1, "month");this.generateCalendar();},// 今天之前触发handleClickDay(day){if(day.isAfterToday) return;this.today = day.date.format("YYYY-MM-DD");this.$emit("change",this.today)}},
};
</script><style lang="scss" scoped>
.calendar {user-select: none;&-top {justify-content: space-between;border: 1px solid #ccc;align-items: center;font-size: 14px;&-same {flex: 1;text-align: center;}}&-body {font-size: 14px;padding: 5px;display: grid;grid-template-columns: repeat(7, 1fr);&-week {background: #f5f7fa;cursor: progress;}> div {margin: 2px;text-align: center;border: #ccc solid 1px;padding: 5px;}&-day {cursor: pointer;.km {font-size: 12px;line-height: 1;color: #333;}&.dis {color: #ccc;// cursor: not-allowed;}&.today {background: #66b1ff;color: #fff;}}}
}
</style>

解释:

  1. today:当前选中的日期,默认今天
  2. month:使用 moment 来追踪当前月份。
  3. generateCalendar:这个方法用来生成日历,包括上个月的部分日期、当前月份的日期和下个月的部分日期。
  4. prevMonthnextMonth: 点击按钮来切换月份。
  5. currentMonth:这个方法是用来跳回到今天。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/144749.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

海睿思ABI——不只是BI,更多的是数据和智能

在当今这个数据洪流席卷各行各业的数字化时代&#xff0c;企业BI的建设已不再是可选项&#xff0c;而是驱动企业转型升级、实现精细化运营的必由之路。传统BI通过临时数据集直连业务系统&#xff0c;仅能展示预设报表和仪表盘&#xff0c;难以集成异构数据源&#xff0c;适应业…

【数学二】函数概念、常用函数、函数四大性质

考试要求 1、理解函数的概念&#xff0c;掌握函数的表示法&#xff0c;并会建立应用问题的函数关系. 2、了解函数的有界性、单调性、周期性和奇偶性. 3、理解复合函数及分段函数的概念、了解反函数及隐函数的概念。 4、掌握基本初等函数的性质及其图形、了解初等函数的概念。…

SpringCloud从零开始简单搭建 - JDK17

文章目录 SpringCloud Nacos从零开始简单搭建 - JDK17一、创建父项目二、创建子项目三、集成Nacos四、集成nacos配置中心 SpringCloud Nacos从零开始简单搭建 - JDK17 环境要求&#xff1a;JDK17、Spring Boot3、maven。 那么&#xff0c;如何从零开始搭建一个 SpringCloud …

PyQGIS开发 3 基础功能开发

PyQGIS开发 3 基础功能开发 1 添加图层树与地图视图 1.1 添加控件 1.2 Python代码 from PyQt5.QtCore import QMimeData from qgis.PyQt.QtWidgets import QMainWindow from qgis._core import QgsMapLayer, QgsRasterLayer, QgsVectorLayer from qgis.core import QgsProje…

美联储降息引爆股市,标普500指数逼近历史新高

在美联储宣布大幅降息后&#xff0c;股市迎来了强劲反弹。投资者信心大增&#xff0c;此前他们就预期美联储会降息0.5个百分点。周四的股市涨幅让标普500指数接近历史收盘最高点。 周四&#xff0c;标普500指数有望刷新历史纪录&#xff0c;此前美联储的大幅降息为市场注入了活…

基于STM32的智能门禁系统(指纹、蓝牙、刷卡、OLED、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STM32单片机&#xff0c;六个按键&#xff0c;分别代表指纹、蓝牙、刷卡的正确进门与错误进门&#xff1b; 比如第一个按键按下&#xff0c;表示指纹正确&#xff0c;OLED显示指纹正确&#x…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核启动】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核&#xff08;LiteOS-M&#xff09; 轻量系统内核&#…

faiss安装 (CPU版本)

faiss版本 faiss-v1.7.4 cd faiss-v1.7.4cmake -B build . -DBUILD_TESTINGOFF -DFAISS_ENABLE_GPUOFF -DFAISS_ENABLE_PYTHONOFFmake -C build -j faiss&#xff1b; 默认安装路径如下 -- Installing: /usr/local/lib64/libfaiss.a -- Installing: /usr/local/include/faiss…

跨境平台通用测评技巧:解锁Temu、亚马逊等平台的销量密码

在当今竞争激烈的跨境电商行业&#xff0c;测评补单虽被视为“公开的秘密”&#xff0c;但无论是消费者还是平台方对此普遍持有反感态度。对于新手店铺而言&#xff0c;若缺乏价格和运营等方面的绝对优势&#xff0c;要在市场中生存下去尤为困难。因此&#xff0c;合理使用测评…

深入探讨IDSIPS:信息安全的未来趋势与应用

引言 在信息技术飞速发展的今天&#xff0c;网络安全问题愈发突出。随着数据泄露、网络攻击等事件频发&#xff0c;企业和个人对信息安全的重视程度不断提高。IDSIPS&#xff08;Intrusion Detection System and Intrusion Prevention System&#xff09;作为信息安全领域的重…

PowerShell install 一键部署Oracle12c

Oracle12c前言 Oracle 12c是甲骨文公司推出的一款关系数据库管理系统,它引入了多项创新特性,如多租户架构、大数据处理和云部署,适用于企业级应用。以下是Oracle 12c的详细介绍: Oracle 12c的主要特点 高性能:通过多线程处理、自动优化等技术,提高了数据库的查询和处理…

非标工业模型评审不再难,3D一览通助力高效协同

在当今工业领域&#xff0c;非标设备设计正成为满足特定客户需求的关键。这类设计服务涉及为特定应用场景量身定制的设备或机器&#xff0c;它们通常不是市场上现成的标准化产品&#xff0c;而是根据客户的独特需求进行个性化设计和制造。 这种定制化过程要求设计团队与客户进…

Abp vNext(五)集成MQTTnet,可收发消息

一 前言 MQTT的相关理论内容这里不做过多介绍&#xff0c;请看下面两篇文章&#xff1a; Introduction MQTT协议中文版 MQTT协议-CSDN博客 这篇文章只做代码实现&#xff0c;文章中使用MQTTnet作为MQTT开发的组件。 MQTT分为服务端和客户端&#xff0c;一个服务端对应多个…

Python和C++及R相关系数数学统计学可视化和神经模型及评估指标

&#x1f3af;要点 较少统计样本显著性评估和变量关系梳理功能磁共振成像一致性分析检测非单调关联性结构随机变量动力学相关性热图和矩阵图基因疫苗非线性变量相关性 Python相关矩阵 相关矩阵 n n n 个随机变量 X 1 , … , X n X_1, \ldots, X_n X1​,…,Xn​ 的相关矩阵…

视频去噪技术分享

视频去噪是一种视频处理技术&#xff0c;旨在从视频帧中移除噪声和干扰&#xff0c;提高视频质量。噪声可能由多种因素引起&#xff0c;包括低光照条件、高ISO设置、传感器缺陷等。视频去噪对于提升视频内容的可视性和可用性至关重要&#xff0c;特别是在安全监控、医疗成像和视…

迅为3A6000_7A2000开发板龙芯全国产处理器LoongArch架构核心主板

龙芯 3A6000 处理器完全自主设计、性能优异&#xff0c;代表了我国自主桌面 CPU 设计领域的最新里程碑成果。龙芯 3A6000 处理器的推出&#xff0c;说明国产 CPU 在自主可控程度和产品性能上已双双达到新高度&#xff0c;也证明了国内有能力在自研 CPU 架构上做出一流的产品。 …

聊聊AUTOSAR:基于Vector MICROSAR的TC8测试开发方案

技术背景 车载以太网技术作为汽车智能化和网联化的重要组成部分&#xff0c;正逐步成为现代汽车网络架构的核心&#xff0c;已广泛应用于汽车诊断&#xff08;如OBD&#xff09;、ECU软件更新、智能座舱系统、高清摄像头环视泊车系统等多个领域。 在这个过程中&#xff0c;ET…

SpringCloud 基于 web 的只会养老平台

摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计…

Django SQL注入-漏洞分析

1.进入项目界面 图1 项目主界面 2.访问任意不存在的目录路径报错&#xff0c;提示存在demo接口 图2 提示存在接口 3.访问/demo/&#xff0c;提示有一个name参数 图3 发现隐藏参数 4.对接口参数进行fuzz&#xff08;实战思路&#xff09;&#xff0c;vulfocus已经给出了/demo?…

Cypress安装与启动(开始学习记录)

一 Cypress安装 使用npm安装 1.查看node.js npm的版本&#xff0c;输入 npm --version 和 node --version&#xff0c;node.js没安装的可以去中文网下载最新稳定版安装&#xff0c;npm不建议升级到最新版本&#xff0c;会导致安装Cypress时Error: Cannot find module ansi-st…