uniapp 微信小程序 自定义日历组件

效果图

功能:可以记录当天是否有某些任务或者某些记录

具体使用:

子组件代码

<template>
	<view class="Accumulate">
		<view class="bx">
			<view class="bxx">
				<view class="plank">
				</view>
				<view class="calendar">
					<view class="calendarbx">
						<view class="calendarview flex jc ac">
							<u-icon name="arrow-left" color="#232323" size="18" @click="addmonth(1)"></u-icon>
							<view class="title">
								{{viewday}}
							</view>
							<u-icon name="arrow-right" color="#232323" size="18" @click="addmonth(2)"></u-icon>
						</view>
						<view class="week flex  ac">
							<view class="weekli" v-for="(item,index) in week">
								{{item.title}}
							</view>
						</view>
						<view class="data">
							<view class=" flex  ac flexwrap" v-if="show">
								<view class="datali flex jc ac" v-for="(item,index) in days" :key="item">
									<!-- 三层判断条件 -->
									<view class="dataliradius flex jc ac flexwrap"
										:class="newday==item&&isnewmonth&&chooseday==item?'dataliradiusc':newday==item&&isnewmonth&&chooseday!=item?'dataliradiuscc':newday!=item&&chooseday==item?'dataliradiusc':''"
										@click.stop="funchoosedayy(item)">
										{{item==newday&&isnewmonth?'今':item}}
										<view class="rounds">
											<view class="round" v-if="recordlist.includes(item)&&item!=chooseday">
											</view>
										</view>
									</view>
								</view>
							</view>
							<!-- 以下是为了防止切换闪烁而复制了一份用于展示 -->
							<view class=" flex  ac flexwrap" v-else>
								<view class="datali flex jc ac" v-for="(item,index) in days" :key="item">
									<!-- 三层判断条件 -->
									<view class="dataliradius flex jc ac flexwrap"
										:class="newday==item&&isnewmonth&&chooseday==item?'dataliradiusc':newday==item&&isnewmonth&&chooseday!=item?'dataliradiuscc':newday!=item&&chooseday==item?'dataliradiusc':''">
										{{item==newday&&isnewmonth?'今':item}}
										<view class="rounds" v-if="recordlist.includes(item)&&item!=chooseday">
											<view class="round">
											</view>
										</view>
									</view>
								</view>
							</view>
						</view>
					</view>
				</view>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				day: Number(new Date()), //用于记录今天
				showday: null, //用来存储要加减的日期
				viewday: null, //页面上展示的日期
				newday: null, //当天几号
				isnewmonth: true, //是否是当月
				chooseday: null, //选中的那一天
				show: true,
				week: [{
						title: '一'
					},
					{
						title: '二'
					},
					{
						title: '三'
					},
					{
						title: '四'
					},
					{
						title: '五'
					},
					{
						title: '六'
					},
					{
						title: '日'
					}
				],
				days: [], //天数数组
				height: 0
			};
		},
props:{
			recordlist:{
				default: [], //是否有练习记录,需要每次切换月份的时候查询,那几天有练习记录,下标会记录
				stype:Array
			}
		},
		onLoad() {

		},
		onReady() {
			let time = this.yearFormat(this.day, 'obj')
			this.newday = time.day; //当天日期只用初始化一次就不用再初始化了
			this.showday = time.year + '-' + time.month + '-' + time.day; //用来存储要加减的日期
			this.viewday = this.yearFormat(this.showday) //页面上展示的日期
			this.chooseday = time.day;
			this.addmonth(0) //初始化时间
		},
		methods: {

			//选中日期
			funchoosedayy(item) {
				// console.log(item, '选中几号');
				if (item == '') {
					return
				}
				this.chooseday = item;
				let dataobj = this.showday.split('-');
				let month;
				let year;
				let day;
				let sendtime = dataobj[0] + '-' + dataobj[1] + '-' + this.chooseday;
				this.$emit('sendtime', '选中的时间:' + sendtime);
			},
			//加减月份,初始化月份
			addmonth(type) {
				this.show = false;
				setTimeout(() => {
					this.show = true;
				}, 100)
				let newmonth = this.yearFormat(this.day, 'obj')
				let dataobj = this.showday.split('-');
				let month;
				let year;
				let day;
				//加
				if (type == 2) {
					if (dataobj[1] == 12) {
						month = 1;
						year = (dataobj[0] * 1) + 1
					} else {
						year = (dataobj[0] * 1);
						month = (dataobj[1] * 1) + 1
					}
				}
				//减
				if (type == 1) {
					if (dataobj[1] == 1) {
						month = 12;
						year = (dataobj[0] * 1) - 1
					} else {
						year = (dataobj[0] * 1);
						month = (dataobj[1] * 1) - 1
					}
				}

				//初始化使用
				if (type == 0) {
					month = (dataobj[1] * 1);
					year = (dataobj[0] * 1);
				}

				let daynum = this.getDaysInYearMonth(year, month);
				this.days = daynum; //获取天数
				let week = this.getDayOfWeek(year, month, 1) //获取每个月1号星期几
				//0 相当于星期日
				let addday;
				if (week == 0) {
					addday = 6;
				} else {
					addday = (week - 1)
				}
				for (let i = 0; i < addday; i++) {
					this.days.unshift('')
					this.$forceUpdate()
				}
				//判断是否是当月,是当月的话,选中当天日期,不是则是当月1号
				if (newmonth.month == month) {
					day = dataobj[2];
					this.chooseday = newmonth.day;
					this.isnewmonth = true;
					this.showday = year + '-' + month + '-' + day;
					this.viewday = year + '年' + month + '月';
					// console.log(this.showday, '当月');
					this.$forceUpdate()
				} else {
					day = 1;
					this.chooseday = day;
					this.isnewmonth = false;
					this.showday = year + '-' + month + '-' + day;
					this.viewday = year + '年' + month + '月';
					this.$forceUpdate()
				}
				// console.log(this.days);
				this.$emit('state_sendtime', '初始化时间:' + this.showday);
				this.$forceUpdate()
			},
			//获取年月
			yearFormat(num, obj) {
				//过滤器 用于格式化时间
				let date = new Date(num); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
				let year = date.getFullYear();
				let month = ("0" + (date.getMonth() + 1)).slice(-2);
				let sdate = ("0" + date.getDate()).slice(-2);
				let hour = ("0" + date.getHours()).slice(-2);
				let minute = ("0" + date.getMinutes()).slice(-2);
				let second = ("0" + date.getSeconds()).slice(-2);
				let result;
				if (obj) {
					// 拼接
					result = {
						year: year,
						month: month,
						day: sdate
					}
				} else {
					result = year + '年' + month + '月'

				}
				// 返回
				return result;
			},
			// 获取该年该月的天数
			getDaysInYearMonth(year, month) {
				// 每一次进行更新前,先清空日期数组
				month = parseInt(month, 10);
				// javascript中Date()对象的getDate()是获取时间对象对应于一个月中的某一天(1~31),当设置为0的时候,getDate()返回的就是最后一天,刚好对应我们需要的值。
				var date = new Date(year, month, 0);
				let arr = [];
				for (var i = 1; i <= date.getDate(); i++) {
					arr.push(i)
				}
				return arr;
			},
			//获取周几
			// console.log(getDayOfWeek(2023, 10, 5)); // 输出:星期四
			// 0就是 周日
			getDayOfWeek(year, month, day) {
				console.log(year, (month * 1), day);
				const date = new Date(year + '-' + (month * 1) + '-' + day).getDay(); // 注意月份是从0开始计数
				const options = {
					weekday: 'long'
				};
				//new Intl.DateTimeFormat('zh-CN', options).format(date)
				return date;
			}
		}
	}
</script>

<style lang="less" scoped>
	.Accumulate {
		// position: relative;
	}

	.back {
		width: 100%;
		height: 360rpx;
		border-radius: 0 0 60rpx 60rpx;
		background: #3366ff;
		position: absolute;
	}

	.Evaluationlist {
		margin-top: 30rpx;
		padding: 0 30rpx;
		box-sizing: border-box;
		overflow: scroll;

		.Evaluationlistli {
			padding: 30rpx 20rpx;
			box-sizing: border-box;
			border-radius: 30rpx;
			background: #fff;
			margin-bottom: 30rpx;

			.left {
				// display: block;
				width: 70%;
				max-height: 100rpx;
			}

			.right {
				padding: 10rpx 30rpx;
				height: 60rpx;
				box-sizing: border-box;
				border-radius: 20rpx;
				background: #3366ff;
				color: #fff;

			}

			.rightb {
				padding: 10rpx 30rpx;
				height: 60rpx;
				box-sizing: border-box;
				border-radius: 20rpx;
				background: #fff;
				color: #3366ff;
				border: 1rpx solid #3366ff;
			}
		}
	}

	.bx {
		width: 100%;
		// position: absolute;
		z-index: 999;

		.plank {
			width: 100%;
			height: 30rpx;
		}
	}

	.viewdata {
		width: 100%;
		height: 130rpx;
		padding: 0 30rpx;
		box-sizing: border-box;

		.viewdatali {
			width: 46%;
			height: 100%;
			border-radius: 30rpx;

			.num {
				width: 100%;
				font-size: 38rpx;
				font-weight: bold;
				text-align: center;
			}

			.title {
				width: 100%;
				font-size: 24rpx;
				margin-top: 5rpx;
				text-align: center;
			}
		}

		.viewdataliA {
			background: #f5f5f5;
			color: skyblue;
		}

		.viewdataliB {
			background: #f5f5f5;
			color: pink;
		}



	}

	.calendar {
		width: 100%;
		// padding: 30rpx 30rpx 0rpx 30rpx;
		box-sizing: border-box;

		// border-radius: 30rpx;
		.calendarbx {
			width: 100%;
			padding: 30rpx 30rpx 0rpx 30rpx;
			box-sizing: border-box;
			border-radius: 30rpx;
			background: #fff;

			.calendarview {
				background: lightgoldenrodyellow;
				padding: 10rpx 20rpx;
				box-sizing: border-box;

				.title {
					color: #232323;
					font-size: 28rpx;
					margin-left: 100rpx;
					margin-right: 100rpx;
				}
			}

			.week {
				font-size: 26rpx;
				color: #999;
				margin-top: 30rpx;

				.weekli {
					width: 12.2%;
					height: 30rpx;
					text-align: center;
					margin-right: 2.4%;
					line-height: 30rpx;
				}

				.weekli:nth-child(7n+7) {
					margin-right: 0% !important;
				}
			}

			.data {
				font-size: 28rpx;
				color: #999;
				margin-top: 40rpx;
				font-weight: bold;
				min-height: 410rpx;

				.datali {
					width: 12.2%;
					height: 50rpx;
					// text-align: center;
					margin-right: 2.4%;
					margin-bottom: 40rpx;

					.dataliradius {
						width: 50rpx;
						height: 50rpx;
						border-radius: 999%;
						background: #fff;
						line-height: 50rpx;
						color: #232323 !important;

						.rounds {
							width: 100%;
							height: 10rpx;

							.round {
								width: 10rpx;
								height: 10rpx;
								border-radius: 999%;
								background: #3366ff;
								margin: auto;
							}
						}
					}

					.dataliradiuscc {
						color: #3366ff !important;


					}

					.dataliradiusc {
						width: 50rpx;
						height: 50rpx;
						border-radius: 999%;
						background: #3366ff;
						color: #fff !important;
						line-height: 50rpx;


					}
				}

				.datali:nth-child(7n+7) {
					margin-right: 0% !important;
				}
			}
		}
	}
</style>

父组件

			<customCalendar @sendtime="sendtime" @state_sendtime="state_sendtime" :recordlist="[27, 25, 26, 29, 28]" ></customCalendar>

有需求可以自行修改。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

上升沿下降沿递增

沿指令&#xff1a;P&#xff1a;上升沿 从01 导通一个扫描周期 N&#xff1a;下降沿 从10 导通一个扫描周期

大数据-268 实时数仓 - ODS层 将 Kafka 中的维度表写入 DIM

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; MyBatis 更新完毕目前开始更新 Spring&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; H…

微博_14.12.2-内置猪手 会员版

微博猪手是一款作用于微博的 XposedLsposed 模块&#xff0c;可以支持未root用户和已root用户使用。进入【我的】页面&#xff0c;点击【右上角的设置】&#xff0c;点击【微博猪手】即可进一步设置其他功能。通过微博猪手模块可以实现去除各种广告&#xff08;开屏、信息流等&…

计算机网络 (21)网络层的几个重要概念

前言 计算机网络中的网络层是OSI&#xff08;开放系统互连&#xff09;模型中的第三层&#xff0c;也是TCP/IP模型中的第二层&#xff0c;它位于数据链路层和传输层之间&#xff0c;负责数据包从源主机到目的主机的路径选择和数据转发。 一、网络层的主要功能 路由选择&#xf…

openwrt nginx UCI配置过程

openwrt 中nginx有2种配置方法&#xff0c;uci nginx uci /etc/config/nginx 如下&#xff1a; option uci_enable true‘ 如果是true就是使用UCI配置&#xff0c;如果 是false&#xff0c;就要使用/etc/nginx/nginx.conf&#xff0c;一般不要修改。 如果用UCI&#xff0c;其…

【深度学习进阶】基于CNN的猫狗图片分类项目

介绍 基于卷积神经网络&#xff08;CNN&#xff09;的猫狗图片分类项目是机器学习领域中的一种常见任务&#xff0c;它涉及图像处理和深度学习技术。以下是该项目的技术点和流程介绍&#xff1a; 技术点 卷积神经网络 (CNN): CNN 是一种专门用于处理具有类似网格结构的数据的…

uni-app 页面生命周期及组件生命周期汇总(Vue2、Vue3)

文章目录 一、前言&#x1f343;二、页面生命周期三、Vue2 页面及组件生命周期流程图四、Vue3 页面及组件生命周期流程图4.1 页面加载时序介绍4.2 页面加载常见问题4.3 onShow 和 onHide4.4 onInit4.5 onLoad4.6 onReachBottom4.7 onPageScroll4.8 onBackPress4.9 onTabItemTap…

缓存淘汰算法:次数除以时间差

记录缓存中的每一项的访问次数、最后访问时间&#xff0c;获取当前时间&#xff0c;可算出时间差&#xff0c;然后&#xff0c;用次数除以时间差&#xff0c;取最小的淘汰。 这一算法比较慢&#xff0c;需配合多级缓存。一级缓存不很大&#xff0c;使用此算法。二级缓存可以大…

uniapp 微信小程序开发使用高德地图、腾讯地图

一、高德地图 1.注册高德地图开放平台账号 &#xff08;1&#xff09;创建应用 这个key 第3步骤&#xff0c;配置到项目中locationGps.js 2.下载高德地图微信小程序插件 &#xff08;1&#xff09;下载地址 高德地图API | 微信小程序插件 &#xff08;2&#xff09;引入项目…

Mac iTerm2集成DeepSeek AI

1. 去deepseek官网申请api key&#xff0c;DeepSeek 2. 安装iTerm2 AI Plugin插件&#xff0c;https://iterm2.com/ai-plugin.html&#xff0c;插件解压后直接放到和iTerms相同的位置&#xff0c;默认就在/Applications 下 3. 配置iTerm2 4. 重启iTerm2,使用快捷键呼出AI对话…

树莓派 Pico RP2040 教程点灯 双核编程案例

双核点亮不同的 LED 示例&#xff0c;引脚分别是GP0跟GP1。 #include "pico/stdlib.h" #include "pico/multicore.h"#define LED1 0 // 核心 0 控制的 LED 引脚 #define LED2 1 // 核心 1 控制的 LED 引脚// the setup function runs once when you press …

简单使用linux

1.1 Linux的组成 Linux 内核&#xff1a;内核是系统的核心&#xff0c;是运行程序和管理 像磁盘和打印机等硬件设备的核心程序。 文件系统 : 文件存放在磁盘等存储设备上的组织方法。 Linux 能支持多种目前浒的文件系统&#xff0c;如 ext4 、 FAT 、 VFAT 、 ISO9660 、 NF…

ACM算法模板

ACM算法模板 起手式基础算法前缀和与差分二分查找三分查找求极值分治法&#xff1a;归并排序 动态规划基本线性 d p dp dp最长上升子序列I O ( n 2 ) O(n ^ 2) O(n2)最长上升子序列II O ( n l o g n ) O(nlogn) O(nlogn) 贪心二分最长公共子序列 背包背包求组合种类背包求排列…

《Vue3实战教程》19:Vue3组件 v-model

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 组件 v-model​ 基本用法​ v-model 可以在组件上使用以实现双向绑定。 从 Vue 3.4 开始&#xff0c;推荐的实现方式是使用 defineModel() 宏&#xff1a; vue <!-- Child.vue --> <script setup> co…

Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决

在 Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决 在 Redis 高可用架构中&#xff0c;哨兵模式&#xff08;Sentinel&#xff09;是确保 Redis 集群在出现故障时自动切换主节点的一种机制。通过使用 Redis 哨兵&#xff0c;我们可以实现 Redis 集群的监控、故障检测和…

数据结构:时间复杂度和空间复杂度

我们知道代码和代码之间算法的不同&#xff0c;一定影响了代码的执行效率&#xff0c;那么我们该如何评判算法的好坏呢&#xff1f;这就涉及到了我们算法效率的分析了。 &#x1f4d6;一、算法效率 所谓算法效率的分析分为两种&#xff1a;第一种时间效率&#xff0c;又称时间…

《Vue3实战教程》39:Vue3无障碍访问

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 无障碍访问​ Web 无障碍访问 (也称为 a11y) 是指创建可供任何人使用的网站的做法——无论是身患某种障碍、通过慢速的网络连接访问、使用老旧或损坏的硬件&#xff0c;还是仅处于某种不方便的环境。例如&#xff0c;…

GESP2024年6月认证C++五级( 第三部分编程题(1)黑白格)

参考程序&#xff08;二维前缀和&#xff09; #include <iostream> #include <vector> #include <algorithm> using namespace std;int main() {int n, m, k;cin >> n >> m >> k;// 输入网格图vector<vector<int>> grid(n, v…

二、SQL语言,《数据库系统概念》,原书第7版

文章目录 一、概览SQL语言1.1 SQL 语言概述1.1.1 SQL语言的提出和发展1.1.2 SQL 语言的功能概述 1.2 利用SQL语言建立数据库1.2.1 示例1.2.2 SQL-DDL1.2.2.1 CREATE DATABASE1.2.2.2 CREATE TABLE 1.2.3 SQL-DML1.2.3.1 INSERT INTO 1.3 用SQL 语言进行简单查询1.3.1 单表查询 …

js按日期按数量进行倒序排序,然后再新增一个字段,给这个字段赋值 10 到1

效果如下图&#xff1a; 实现思路&#xff1a; 汇总数据&#xff1a;使用 reduce 方法遍历原始数据数组&#xff0c;将相同日期的数据进行合并&#xff0c;并计算每个日期的总和。创建日期映射&#xff1a;创建一个映射 dateMap&#xff0c;存储每个日期的对象列表。排序并添加…