自定义 vant 的 van-calendar 日历控件

最近在做 vue 微信公众号项目, 有个自定义日历控件展示的需求,经过查阅资料,最终实现了如图所示效果,这里做了总结,需要的小伙伴可以参考一下:

HTML代码:

<template><div class="pageContainer"><div class="vanCalendar"><div class="topTitle"><div class="topYear">{{ new Date().getFullYear() }}</div>{{ new Date().getMonth() + 1 }}月</div><van-calendarref="calendar"color="#1989fa":formatter="formatter":min-date="minDate":max-date="maxDate":show-title="false":show-mark="false":show-subtitle="false":poppable="false":show-confirm="false"@select="onCalendarSelect"/></div></div>
</template>

JS代码: 

<script>
export default {data() {return {dateList: [],minDate: "",maxDate: "",};},created() {const currentDate = new Date();const year = currentDate.getFullYear();const month = currentDate.getMonth();this.minDate = new Date(year, month, 1);this.maxDate = new Date(year, month, this.getLastDayOfMonth());// 模拟异步请求setTimeout(() => {this.dateList = [{ date: "2024/06/01", status: "0" },{ date: "2024/06/02", status: "0" },{ date: "2024/06/03", status: "1" },{ date: "2024/06/04", status: "1" },{ date: "2024/06/05", status: "2" },{ date: "2024/06/06", status: "2" },{ date: "2024/06/07", status: "2" },{ date: "2024/06/08", status: "2" },{ date: "2024/06/09", status: "2" },{ date: "2024/06/10", status: "1" },{ date: "2024/06/11", status: "1" },{ date: "2024/06/12", status: "1" },{ date: "2024/06/13", status: "1" },{ date: "2024/06/14", status: "1" },{ date: "2024/06/15", status: "0" },{ date: "2024/06/16", status: "0" },{ date: "2024/06/17", status: "1" },{ date: "2024/06/18", status: "1" },{ date: "2024/06/19", status: "1" },{ date: "2024/06/20", status: "1" },{ date: "2024/06/21", status: "1" },{ date: "2024/06/22", status: "0" },{ date: "2024/06/23", status: "0" },{ date: "2024/06/24", status: "2" },{ date: "2024/06/25", status: "2" },{ date: "2024/06/26", status: "1" },{ date: "2024/06/27", status: "1" },{ date: "2024/06/28", status: "1" },{ date: "2024/06/29", status: "0" },{ date: "2024/06/30", status: "0" },];});},methods: {// 自定义日期文案formatter(day) {let isHasData = 0;let dayTimestamp = this.formattedDateFunc(day.date);this.dateList.forEach((item) => {if (dayTimestamp == item.date) {isHasData = item.status;}});// status=1,日期下方添加黄点if (isHasData == 1) {day.className = "addOrangeDot";}// status=2,日期下方添加绿点if (isHasData == 2) {day.className = "addGreenDot";}// 当前选中的日期if (day.type == "selected") {if (isHasData == 1) {// 给选中的日期加上蓝色实心圆,且status=1,日期下方添加黄点day.className = "selectedDay addOrangeDot";}if (isHasData == 2) {// 给选中的日期加上蓝色实心圆,且status=2,日期下方添加绿点day.className = "selectedDay addGreenDot";}}// 当天日期if (dayTimestamp == this.formattedDateFunc()) {if (isHasData == 1) {// 给当天加上蓝色空心圆,且status=1,日期下方添加黄点day.className = "addOrangeDot calendarToday";}if (isHasData == 2) {// 给当天加上蓝色空心圆,且status=2,日期下方添加绿点day.className = "addGreenDot calendarToday";}}return day;},// 日期被选中时触发的方法onCalendarSelect(val) {this.$toast("当前选中日期:" + this.formattedDateFunc(val, "-"));},// 获取当月的最后一天getLastDayOfMonth() {const date = new Date();const year = date.getFullYear();const month = date.getMonth();const lastDay = new Date(year, month + 1, 0).getDate();return lastDay;},// 日期格式化formattedDateFunc(timestamp, type = "/") {const currentDate = timestamp ? new Date(timestamp) : new Date();const year = currentDate.getFullYear();let month = currentDate.getMonth() + 1;let day = currentDate.getDate();month = month < 10 ? `0${month}` : month;day = day < 10 ? `0${day}` : day;return `${year}${type}${month}${type}${day}`;},},
};
</script>

CSS代码: 


<style lang="scss" scoped>
.pageContainer {height: calc(100vh - 68px);background: #fff;font-size: 18px;overflow: auto;.vanCalendar {::v-deep .van-calendar__month-title {display: none;}::v-deep .van-calendar__header {box-shadow: none;}//有数据日期加点.addGreenDot,.addOrangeDot {position: relative;}// 绿点::v-deep .addGreenDot::after {position: absolute;content: "";width: 6px;height: 6px;top: 56px;left: 25px;border-radius: 50%;background-color: rgb(34, 177, 76);}// 黄点::v-deep .addOrangeDot::after {position: absolute;content: "";width: 6px;height: 6px;top: 56px;left: 25px;border-radius: 50%;background-color: #ff822c;}//当天日期::v-deep .calendarToday {position: relative;}// 当天日期添加空心蓝色圆::v-deep .calendarToday::before {width: 40px;height: 40px;line-height: 40px;position: absolute;top: 11px;left: 9px;content: "";text-align: center;font-size: 30px;border-radius: 50%;border: 2px solid rgb(25, 137, 250);}//选中的日期::v-deep .selectedDay {position: relative;}::v-deep .selectedDay::before {width: 40px;height: 40px;line-height: 40px;position: absolute;top: 12px;left: 8.6px;content: "";text-align: center;font-size: 30px;border-radius: 50%;border: none;}//选中的日期添加实心蓝色圆::v-deep .van-calendar__selected-day {border-radius: 50%;background: #59afff;z-index: 2;position: absolute;border: none;}::v-deep .van-calendar__selected-day::after {background-color: #fff !important;}::v-deep .van-calendar__header-subtitle {display: none;}::v-deep .van-calendar__selected-day {width: 40px;height: 40px;}}.topTitle {position: relative;padding: 10px;text-align: center;background: #fff;font-size: 24px;font-weight: bold;}.topYear {position: absolute;left: 0;font-weight: normal;}
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

I/O系统

1. I/O接口 接口可以看做两个系统或两个部件之间的交接部分&#xff0c;它既可以是两种硬设备之间的连接电路&#xff0c;也可以是两个软件之间的共同逻辑边界。 I/O接口通常是指主机与I/O设备之间设置的一个硬件电路及其相应的软件控制。 2. 程序查询方式 程序查询方式是一…

知乎正通过乱码来干扰必应/谷歌等爬虫,从而限制中文数据集被用于AI训练

有用户反馈称使用微软必应搜索和谷歌搜索发现存在不少知乎乱码内容&#xff0c;即搜索结果里知乎内容的标题和正文内容都可能是乱码的&#xff0c;但抓取的正文前面一些段落内容可以正常查看。考虑到此前知乎已经屏蔽除百度和搜狗以外的所有搜索引擎爬虫 (蜘蛛 / 机器人)&#…

酣客的“FFC模式”|白酒商业模式|分润制度顶层架构设计

酣客公社摒弃传统商业模式&#xff0c;提出“心联网”及“FFC模式”的商业模式。 坐标&#xff1a;厦门&#xff0c;我是肖琳 深耕社交新零售行业10年&#xff0c;主要提供新零售系统工具及顶层商业模式设计、全案策划运营陪跑等。 今天和大家分享“酣客”的营销模式&#xff…

检信智能推出我国首款Allemotion OS基于AI生理心理参数服务开发者平台

检信Allemotion OS生理心理开发者平台是根据世界人工智能高速发展的特点,为实现脑机交互的行业需求&#xff0c;由检信智能推出我国首款检信Allemotion OS生理心理开发者平台。检信Allemotion OS生理心理开发者平台集成了振动影像心理情绪20项情绪参数、11项生理相关参数&#…

知识图谱——Neo4j数据库实战

数据与代码链接见文末 1.Neo4j数据库安装 JDK 安装:https://www.oracle.com/java/technologies/javase-downloads.html Neo4j 安装:https://neo4j.com/download-center/ 配置好 JDK 和 Neo4j 的环境变量

2、Redis持久化与高可用架构

一、Redis 持久化 RDB 快照&#xff08;Snapshot&#xff09; 基本概念&#xff1a;RDB&#xff08;Redis DataBase&#xff09;快照是将 Redis 内存中的数据在某个时间点保存到磁盘中的一种持久化方式&#xff0c;默认保存到 dump.rdb 的二进制文件中。通过 RDB 快照&#xff…

C# 中的 StreamReader 和 StreamWriter 类

在这里插入代码片StreamReader 和 StreamWriter 位于 System.IO 命名空间中。当您想要读取或写入基于字符的数据时&#xff0c;这两个类都很有用。这两个类都处理 Unicode 字符。 StreamReader 派生自抽象类“TextReader”&#xff0c;StreamWriter 派生自“TextWriter”。 下…

Python处理Excel 的常用操作详解

要在Python中处理Excel文件&#xff0c;可以使用openpyxl库来处理.xlsx文件&#xff0c;或者使用xlrd和xlwt&#xff08;或其升级版openpyxl&#xff09;来处理.xls文件。 请注意&#xff0c;你需要先安装 pandas 和 openpyxl 库才能运行代码。可以使用以下命令安装&#xff1a…

静态类和静态构造函数

静态类 概念 用static修饰的类。 特点 只能包含静态成员&#xff0c;不能被实例化。 作用 1.将常用的静态成员写在静态类中方便使用。 2.静态类不能被实例化&#xff0c;更能体现工具类的唯一性。 比如&#xff1a;Console就是一个静态类。 静态构造函数 概念 在构造…

springboot系列七: Lombok注解,Spring Initializr,yaml语法

老韩学生 LombokLombok介绍Lombok常用注解Lombok应用实例代码实现idea安装lombok插件 Spring InitializrSpring Initializr介绍Spring Initializr使用演示需求说明方式1: IDEA创建方式2: start.spring.io创建 注意事项和说明 yaml语法yaml介绍使用文档yaml基本语法数据类型字面…

C# 日志框架Serilog使用

1、框架和说明 C#日志框架Serilog支持多种场景输出&#xff0c;简单验证了一下&#xff0c;比较方便 包的安装&#xff0c;推荐直接使用“推荐NuGet包管理器”安装Serilog.AspNetCore&#xff0c;常见的组件都已经集成在一个包中&#xff0c;使用比较方便 2、配置文件 Serilog…

Rethinking Semantic Segmentation: A Prototype View 2022CVPR Oral

流行的语义分割方案的掩码解码策略&#xff08;基于参数softmax或基于像素查询&#xff09;视为可学习的类原型。本研究揭示了这种参数分割策略的几个局限性&#xff0c;并提出了一种基于不可学习原型的非参数替代方案。与之前的方法以完全参数化的方式为每个类学习单个权重/查…

【代码随想录算法训练营第五十二天|647.回文子串、516.最长回文子序列】

文章目录 647.回文子串动态规划双指针法 516.最长回文子序列 647.回文子串 动态规划 dp[i][j]指的是s[i:j1]这段是否是回文串&#xff0c;如果s[i]s[j]需要分三种情况来判断&#xff0c;如果ij或者ji1&#xff0c;那么就是回文串&#xff0c;否则还要看这中间的是否是回文串&…

Kubernetes面试整理-如何利用PodSecurityPolicies来提高集群的安全性?

PodSecurityPolicy (PSP) 是 Kubernetes 中用于定义和控制 Pod 安全配置的策略。通过 PSP,可以设置对 Pod 的一些安全约束条件,从而提高集群的安全性。虽然 PSP 从 Kubernetes 1.21 开始已被弃用,并在 1.25 版本中移除,但在一些旧版 Kubernetes 集群中,PSP 仍然是一个重要…

ubuntu22.04编译安装tesseract

1、 为什么用自己编译安装&#xff0c;而不采用apt安装&#xff1f; 由于tesseract有很多依赖包&#xff0c;直接用deb包或者rpm包等安装包安装很复杂&#xff0c;不一定能成功安装。 2、安装基本的依赖包 sudo apt update sudo apt install g autoconf automake libtool pkg…

Docker-Compose一键部署项目

Docker-Compose一键部署项目 目录 Docker-Compose一键部署项目介绍部署Django项目项目目录结构 docker-compose.ymlnginx的default.conf文件后端Dockerfile文件mysql.env一键部署DNS域名解析引起的跨域问题 介绍 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的…

如何排查Java应用的死锁

排查Java应用中的死锁问题是一个复杂但重要的任务&#xff0c;因为死锁会导致应用程序停止响应&#xff0c;影响用户体验和系统稳定性。以下是一些方法和步骤&#xff0c;帮助你排查Java应用中的死锁。 1. 理解死锁的概念 在计算机科学中&#xff0c;死锁是指两个或多个线程相…

新手向导:掌握Axure RP的第一步

其实很多时候&#xff0c;我们很容易把教程做得太复杂&#xff0c;让学生失去重点被复杂的理论吓到。入门基础的时候只需要先弄清楚两个核心内容&#xff0c;学起来就容易多了:一是简单了解这个软件&#xff0c;二是学习这个软件的基本操作。所以如果你问我什么是好的 Axure RP…

cesium升级到116版本后底图和地形加载问题

cesium在2023-07-03 升级到了107版本&#xff0c;107版本加载底图和地形方式做了变更&#xff0c;之前的imageryProvider 和 CesiumTerrainProvider方式被remove掉了&#xff0c;换了另外方式。变更如下所示&#xff1a; cesium/CHANGES.md at 1.116 CesiumGS/cesium GitHub…

【QCustomPlot实战系列】QCPGraph折线图的渐变

包含折线图渐变效果以及QCPAxisTickerDateTime的使用 static QBrush GenerateLinearBrush(Qt::Orientation orientation) {qreal x 1;qreal y 0;if (orientation Qt::Vertical) {x0;y1.5;}QLinearGradient gradient(0, y, x, 0);gradient.setCoordinateMode(QLinearGradie…