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

news/2025/1/8 2:08:22/

效果图

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

具体使用:

子组件代码

<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位的话不需乘1000let 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>

有需求可以自行修改。


http://www.ppmy.cn/news/1561431.html

相关文章

【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 1. 相关排序和查找算法的原理 2. C 类与成员函数的定义 3. 数组作为类的成员变量的处理 4. 函数参数传递与返回值处理 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a; 将直接插入排序、直接选择排序、冒泡…

使用MPTCP+BBR进行数据传输,让网络又快又稳

1.前言 在前文《链路聚合技术——多路径传输Multipath TCP(MPTCP)快速实践》中我们使用mptcpize run命令实现了两个节点间通信使用MPTCP协议进行传输&#xff0c;并实现了传输速率的聚合。 实际应用中更推荐原生支持mptcp的应用&#xff0c;在MPTCP官网中可以看到如TCPDump、…

多模态论文笔记——GLIDE(DALL·E 2模型核心部件)

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍了OpenAI的DALLE 2模型中重要的组成部分&#xff0c;用于图像生成的GLIDE模型及其论文。 文章目录 论文背景扩散模型&#xff08;Diffusion Models&…

会员制电商创新:开源 AI 智能名片与 2+1 链动模式的协同赋能

摘要&#xff1a;本文聚焦于电商领域会员制的关键作用&#xff0c;深入探讨在传统交易模式向数字化转型过程中&#xff0c;如何借助开源 AI 智能名片以及 21 链动模式商城小程序&#xff0c;实现对会员数据的精准挖掘与高效利用&#xff0c;进而提升企业的营销效能与客户洞察能…

commit 错分支的一些补救操作

使用 git reset 撤销提交 使用 git reset 命令撤销提交&#xff0c;并将文件恢复到暂存区或工作目录。 如果你希望完全撤销提交并清空暂存区&#xff08;即撤销本地更改&#xff09;&#xff0c;可以使用 --hard&#xff1a; 复制代码 方案1:git reset --hard HEAD~1 # 撤销…

基于 GPUTasker 的 GPU 使用情况钉钉推送机器人实现

引言 https://github.com/cnstark/gputasker 随着 AI 模型的广泛应用&#xff0c;GPU 成为团队中最重要的资源之一。然而&#xff0c;如何实时监控 GPU 的使用情况并及时通知团队是一个值得关注的问题。为了更好地管理显卡资源&#xff0c;本文基于 GPUTasker&#xff0c;实现了…

最新版Chrome浏览器加载ActiveX控件之SolidWorks 3D控件

背景 SolidWorks Composer Player 是一个免费应用程序&#xff0c;它允许内容创作者将 Composer 内容分发给任何最终用户。Composer Player 与 Composer 一样具有高性能。Composer Player 绝不仅仅是一个简单的查看器&#xff0c;内容使用者可以在产品可交付内容中获得深入的互…

neo4j学习笔记

图数据库 图数据库是基于图论实现的一种NoSQL数据库&#xff0c;其数据存储结构和数据查询方式都是图论为基础的&#xff0c;图数据库主要用于存储更多的连接数据。 图论&#xff08;GraphTheory&#xff09;是数学的一个分支。图论以图为研究对象&#xff0c;图论的图是由若干…