uniapp 简易自定义日历

注:此日历是根据接口返回的日期自动对应星期的,返回的数据中也包含星期,其实就是一个div自定义,可根据自己需求更改;
在这里插入图片描述
1、组件代码 gy-calendar-self.vue

<template><view class="calendar"><view class="selsct-date">请选择预约日期</view><!-- 日历头部,显示星期 --><view class="weekdays"><view v-for="day in weekDays" :key="day" class="weekday">{{ day }}</view></view><!-- 日历主体 --><view class="calendar-body"><view v-for="(week, weekIndex) in calendarData" :key="weekIndex" class="week"><viewv-for="(day, dayIndex) in week":key="dayIndex"@click="selectDate(day)":class="{'has-schedule': day.schState !== 0 }"class="day":style="{ width: cellWidth + 'rpx' }"><view class="day-label">{{ day.dateLabel }}</view><view v-if="day.day"class="day-status-has":class="[day.info == '有' ? 'day-status-has' : day.info == '满' ? 'day-status-over' : 'day-status-none']">{{day.info}}</view></view></view></view></view>
</template><script>
export default {props: {scheduleData: {type: Array,default: () => [],},},data() {return {weekDays: ["日", "一", "二", "三", "四", "五", "六"],calendarData: [],selectedDate: null,cellWidth: 100, // 单位为rpx};},created() {this.generateCalendar();},methods: {generateCalendar() {const startDate = new Date(this.scheduleData[0].dateWork);const endDate = new Date(this.scheduleData[this.scheduleData.length - 1].dateWork);let currentDate = new Date(startDate);let week = [];if (currentDate.getDay() !== 0) {for (let i = 0; i < currentDate.getDay(); i++) {week.push({});}}while (currentDate <= endDate) {const dateWork = currentDate.toISOString().split('T')[0];const schState = this.getScheduleState(dateWork);const weekDay = currentDate.getDay();const day = currentDate.getDate();const dayObject = { date: dateWork, dateLabel: this.formatDateLabel(currentDate), schState, weekDay, day };week.push(dayObject);if (currentDate.getDate() === new Date().getDate()) {// Check if the current date matches the current datethis.selectedDate = dayObject;}if (currentDate.getDay() === 6) {this.calendarData.push(week);week = [];}currentDate.setDate(currentDate.getDate() + 1);}if (week.length > 0) {this.calendarData.push(week);}// Check if the last week array has fewer than 7 elementsconst lastWeek = this.calendarData[this.calendarData.length - 1];const remainingCells = 7 - lastWeek.length;if (remainingCells > 0) {// Add empty objects to fill the remaining cellsfor (let i = 0; i < remainingCells; i++) {lastWeek.push({});}}this.calendarData.forEach((item) => {if (item && item.length > 0) {item.forEach((s) => {s.info = s.schState == 1 ? "有" : s.schState == 0 ? "满" : "无";s.pkSchs = s.pkSchs});}});console.log(this.calendarData, 'this.calendarData')},getScheduleState(date) {const scheduleItem = this.scheduleData.find(item => item.dateWork === date);return scheduleItem ? scheduleItem.schState : 0;},selectDate(day) {this.selectedDate = day;const additionalData = this.scheduleData.find(item => item.dateWork === day.date);console.log(additionalData, 'additionalData')this.$emit('selceted', additionalData);// this.$emit('selceted', day)},isDateSelected(day) {return this.selectedDate && day.date === this.selectedDate.date;},formatDateLabel(date) {const month = date.getMonth() + 1;const day = date.getDate();return `${this.padZero(month)}-${this.padZero(day)}`;},padZero(num) {return num < 10 ? `0${num}` : `${num}`;},},
};
</script><style scoped lang="scss">
.calendar {display: flex;flex-direction: column;font-family: Arial, sans-serif;.selsct-date {text-align: center;margin: 20rpx auto;}
}.weekdays {display: flex;justify-content: space-around;// background-color: #f2f2f2;padding: 10rpx;// border-bottom: 1px solid #ccc;.weekday {text-align: center;padding: 5rpx;font-weight: bold;flex: 1;}
}.calendar-body {display: flex;flex-wrap: wrap;justify-content: center;padding: 0 10rpx;
}.day {position: relative;text-align: center;padding: 10rpx 0;cursor: pointer;box-sizing: border-box;flex: 1;.day-label {font-size: 28rpx;// font-weight: bold;}.day-status-has {width: 40rpx;height: 40rpx;color: #4AB039;opacity: 0.8;background-color: #EDF8EC;border-radius: 50%;text-align: center;line-height: 40rpx;border-radius: 50%;box-sizing: border-box;margin: auto;}.day-status-over {width: 40rpx;height: 40rpx;color: #EA4070;opacity: 0.8;background-color: #EFEFEF;border-radius: 50%;text-align: center;line-height: 40rpx;border-radius: 50%;box-sizing: border-box;margin: auto;}.day-status-none {width: 40rpx;height: 40rpx;color: rgb(102, 102, 102);opacity: 0.8;background-color: #EFEFEF;border-radius: 50%;text-align: center;line-height: 40rpx;border-radius: 50%;box-sizing: border-box;margin: auto;}&.selected {background-color: #85af8b;color: #fff;}
}.week {display: flex;flex-wrap: wrap;
}
</style>

2、引入

<view class="calendar-box" v-if="showCalendar"><u-popup v-model="showCalendar" safe-area-inset-bottom mode="bottom"><data-calendar :scheduleData="selectedList" @selceted="selcetedDate"></data-calendar></u-popup>
</view>

最后附上返回的数据格式:
只需要 dateWork 和 week
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

基于dinoV2分类模型修改

前言 dinoV2已经发布有一段时间了&#xff0c;faecbook豪言直接说前面的结构我们都不需要进行修改&#xff0c;只需要修改最后的全连接层就可以达到一个很好的效果。我们激动的揣摸了下自己激动的小手已经迫不及待了&#xff0c;这里我使用dinoV2进行了实验&#xff0c;来分享…

Angular系列教程之自定义指令

文章目录 前言指令的基本概念在模板中使用指令总结 前言 在Angular中&#xff0c;指令是一种非常强大的工具&#xff0c;用于扩展HTML元素的功能和行为。它们允许我们创建可重用的组件&#xff0c;并在应用程序中的多个地方使用它们。本文将介绍Angular指令的基础知识&#xf…

软件测试|sqlalchemy relationship

简介 SQLAlchemy是一个流行的Python ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它允许我们以面向对象的方式管理数据库。在SQLAlchemy中&#xff0c;relationship是一个重要的功能&#xff0c;用于建立表之间的关系。在本文中&#xff0c;我们将详细探讨relation…

基于MATLAB计算无线通信覆盖(一)环境准备

一、环境 MATLAB 2022b 注&#xff1a;开始仿真前需部署地理坐标区和地理图&#xff0c;最好采用第三种&#xff0c;直接把底图数据下载到本地&#xff0c;防止连接不上网络时只能显示darkwater的底图。 可用于地理坐标区和地理图的底图如下表所示 二、下载底图并安装 工具&…

低代码助力制造业数智转型,激发创新力迎接工业 4.0

随着科技的不断进步&#xff0c;我们迈入了一个崭新的工业时代——工业4.0。这场工业革命不仅颠覆了制造业的传统形象&#xff0c;还为全球生产方式带来了前所未有的变革。 在这一过程中&#xff0c;制造业数字化转型逐渐成为主旋律&#xff0c;而低代码技术在这其中发挥着重要…

Redis 服务器 命令

目录 1.Redis Client Pause 命令 - 在指定时间内终止运行来自客户端的命令简介语法可用版本: > 2.9.50返回值: 返回 OK。如果 timeout 参数是非法的返回错误。 示例 2.Redis Debug Object 命令 - 获取 key 的调试信息简介语法可用版本: > 1.0.0返回值: 当 key 存在时&…

Active Directory监控工具

Active Directory 是 Microsoft 为 Windows 环境实现的 LDAP 目录服务&#xff0c;它允许管理员对用户访问资源和服务实施公司范围的策略。Active Directory 通常安装在 Windows 2003 或 2000 服务器中&#xff0c;它们统称为域控制器。如果 Active Directory 出现故障&#xf…

低代码-详情页组件设计

效果图 详情页数据结构定义 layout:{// 按钮数据buttonLayout:{headButton:[], // 页头按钮footButton:[] // 页脚按钮},// 详情页表单配置config:{}, // 配置组件列表detailLayout:[]}默认行为 进表单初始化&#xff0c;只展示表单属性&#xff0c;隐藏通用、数据、事件tab项…

【生存技能】git操作

先下载git https://git-scm.com/downloads 我这里是win64&#xff0c;下载了相应的直接安装版本 64-bit Git for Windows Setup 打开git bash 设置用户名和邮箱 查看设置的配置信息 获取本地仓库 在git bash或powershell执行git init&#xff0c;初始化当前目录成为git仓库…

软件测试大作业||测试计划+测试用例+性能用例+自动化用例+测试报告

xxx学院 2023—2024 学年度第二学期期末考试 《软件测试》&#xff08;A&#xff09;试题&#xff08;开卷&#xff09; 题目&#xff1a;以某一 web 系统为测试对象&#xff0c;完成以下文档的编写&#xff1a; &#xff08;满分 100 分&#xff09; &#xff08;1&am…

Android中集成FFmpeg及NDK基础知识

前言 在日常App开发中,难免有些功能是需要借助NDK来完成的,比如现在常见的音视频处理等,今天就以ffmpeg入手,来学习下Android NDK开发的套路. JNI和NDK 很多人并不清除JNI和NDK的概念,经常搞混这两样东西,先来看看它们各自的定义吧. JNI和NDK 很多人并不清除JNI和NDK的概念…

用julia演示蝴蝶效应:洛伦兹吸引子

文章目录 Lorentz吸引子julia绘图关闭抗锯齿 蝴蝶效应的名字来源于蝴蝶扇动翅膀的动作&#xff0c;虽然这个动作微小&#xff0c;但可能会在数周后引起飓风等极端天气的发生。这种现象表明&#xff0c;微小的变化可能会被放大并产生非线性的结果。这个概念最早由美国气象学家爱…