最新要闻
- 许婷律师联系方式_许婷
- 内地5月26日上映!《小美人鱼》新预告:女主被鲨鱼追杀-天天快资讯
- 给AI小姐姐留着 西数16TB硬盘到手1549元(非SMR)
- 5代都玩腻了 5月17日或公布《GTA6》新消息 期待吗? 当前热文
- 环球观热点:彻底放弃Win7!U盘软件Rufus发布4.0版本
- 视效大片!《变形金刚7:超能勇士崛起》确认引进内地:预计6月上映
- 四大会计师事务所排名百科(四大会计师事务所排名)
- 世界即时:台湾拚非核疯绿电 企业买高中培养风电人才
- 女子淄博买切糕2种口味称重仅6元火了!五一客流量爆满:喊话推荐其他山东城市
- 中国广电合约机明天上市:iPhone 14最低2586元 全面支持5G|最资讯
- 并非永久关停!天涯社区官方:会回来的 天天百事通
- 环球滚动:一加功不可没!OPPO成为中国手机市场Q1安卓销量第一名
- 速看:杭州、合肥土拍又“火爆”了
- 患者反复腹痛7年!南华医院一招肠菌移植显奇效-视讯
- 湖南工学院与衡阳师范学院联合举办2023年“一校一书”阅读推广暨读书节活动开幕式 焦点消息
- 售价接近110万 网友绘制比亚迪仰望U8改装版:高低也得整一辆|天天热消息
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
记录-Vue移动端日历设计与实现
(资料图片仅供参考)
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
工作中遇到一个需求是根据日历查看某一天/某一周/某一月的睡眠报告,但是找了好多日历组件都不是很符合需求,只好自己手写一个日历组件,顺便记录一下。
先看看UI给的设计图和,需求是有数据的日期做标记,可以查看某一周/某一月的数据,周数据不用自定义,就按照日历上的周数据截取.
实现效果
1.规划dom部分区块划分
2.页面实现
选择月份和选择年份与日期做了条件渲染,切换方式是点击顶部时间切换选项
{{ date.join("/") }}{{ item }}{{ s.day }}{{ k === 1 ? "" : "看周报" }}{{ i }}月{{ i }}代表有睡眠报告取消看月报
css部分
3.接下来是逻辑处理部分
日数据的显示一共42条数据,先获取当前月的总天数,将每个月的天数保存在一个数组里,然后根据传入的参数返回相应的天数, 因为有闰年的存在,2月会是29天,所以做了闰年的判断.然后获取每周的第一天是周几,使用new Date().getDay()获取某一天是周几,返回的是0-7,这里为了方便使用将日历表头用数组保存起来返回的数字刚好是日里头对应的下标,然后根据第一天是周几计算出需要补上个月的几天数据,通过new Date(y,m,0)可以获取到上个月最后一天的,然后向日数据中添加上个月最后几天的数据,补充下个月开始的几天数据,直接使用42减去当月的天数和补充的上个月的天数得到的就是需要补充的下月天数.
月数据的切换显示,前后翻动切换年数据,每年固定都是12月所以就直接写固定值12然后v-for遍历生成dom
年数据的切换显示,每页显示12条数据,保存每页数据的第一条和最后一条用于前后翻页计算显示的数据+12或者-12.
校验选择的月份和已选择的日期是否匹配,因为选择日期后再切换月份有可能切换到的月份没有选择的日期如31日30日29日,所以需要验证是否正确,若是没有的话就当前月的最后一天.
手势操作没有写完整,只写了年份选择的滑动事件逻辑.
为了方便js部分的代码每行都有写详细的注释
自定月选择日期范围只需要修改日期点击事件的逻辑,新增一个参数判断是单日期选择还是选择一个日期范围,在事件处理里面记录点击的两个日期并计算中间的日期保存返回.
<script>import { formatTime } from "@/utils/format";export default { name: "calendar", props: { haveList: { type: Array, default: [], }, }, data() { return { // 切换日期选择 show: "date", // 日历头 header: ["日", "一", "二", "三", "四", "五", "六"], // 选择日期 date: [], // 年列表 yearList: [], // 天列表 dayList: [], // 定时器 timer: null, // 手势操作数据 move: { pageX: 0, fNum: null, lNum: null, }, // 第一天是周几 weeks: 0, }; }, created() {}, mounted() { let time = new Date(); this.date.push( time.getFullYear(), formatTime(time.getMonth() + 1), formatTime(time.getDate()) ); this.countDay(); }, methods: { // 计算显示的天数据 countDay() { console.log("chufa"); let [y, m, d] = this.date; // 获取第一天是周几 let week = new Date(`${y}/${m}/1`).getDay(), // 获取当前月的上个月多少天 lastDays = this.getDays(y, m - 1), // 获取这个月有多少天 days = this.getDays(y, m); // 计算这个月有多少周 this.weeks = Math.ceil((days - (7 - week)) / 7) + 1; // 将当前月份的天数生成数组 this.dayList = Array.from({ length: this.getDays(y, m) }, (v, k) => { return { day: formatTime(k + 1), month: m, year: y, }; }); // 将本月1日前的数据补齐 for (let i = lastDays; i > lastDays - week; i--) { this.dayList.unshift({ day: i, // 如果当前日期是1月补齐的是去年12月的数据 month: +m - 1 === 0 ? 12 : formatTime(+m - 1), year: +m - 1 === 0 ? y - 1 : y, }); } // 计算需要补齐多少天 let length = this.weeks * 7 - this.dayList.length; console.log("length", week, lastDays, days, this.weeks); // 将本月最后一天的数据补齐 for (let i = 1; i <= length; i++) { this.dayList.push({ day: i, // 如果当前日期是12月补齐的是明年年1月的数据 month: +m + 1 > 12 ? 1 : formatTime(+m + 1), year: +m + 1 > 12 ? y + 1 : y, }); } console.log(this.dayList); }, // 顶部时间点击事件 selectDate() { let type = { month: "year", date: "month", }; // 判断点击事件选择月份还是年份 if (this.show !== "year") { this.show = type[this.show]; } // 如果是月份就计算dateList数据 if (this.show === "month") { // 清空每页显示的年份数据 this.yearList.length = 0; // 计算页面显示的年份数据 每页显示12条数据 for (let i = this.date[0] - 4; i <= this.date[0] + 7; i++) { this.yearList.push(i); } } }, // 屏幕点击事件 touchStart(val) { // 获取按下屏幕的x轴坐标 this.move.pageX = val.touches[0].pageX; }, // 左右滑动切换事件 touchMove(val) { // 获取按下屏幕移动结束的x轴坐标 let move = val.touches[0].pageX; clearTimeout(this.timer); // 判断往左滑动还是往右滑动 // 滑动结束x轴坐标减去最初按下坐标为负数就是往左滑动,翻看当前日期以后的年份 if (move - this.move.pageX < -20) { console.log("右滑", this.move.lNum); // 定时器防抖 this.timer = setTimeout(this.changeYear("right"), 100); } // 滑动结束x轴坐标减去最初按下坐标为正数就是往右滑动,翻看当前日期以前的年份 if (move - this.move.pageX > 20) { // 定时器防抖 this.timer = setTimeout(this.changeYear("left"), 100); } }, // 年份选择切换 changeYear(type) { // 清空每页显示的年份数据 this.yearList.length = 0; if (type === "right") { // 计算页面显示的年份数据 每页显示12条数据 for (let i = this.move.lNum + 1; i < this.move.lNum + 13; i++) { this.yearList.push(i); } } else { for (let i = this.move.fNum - 12; i < this.move.fNum; i++) { this.yearList.push(i); } } }, // 年份点击事件 selectYear(val) { this.date[0] = val; this.show = "month"; }, // 月份点击事件 selectMonth(val) { this.date[1] = val; this.show = "date"; this.countDay(); this.checkDay(); }, // 校验选择的月份和已选择的日期是否匹配 checkDay() { // 获取选择的年月有多少天 防止这年不是闰年 就将日期跳转到28号,或者有的月份没有31号就跳到30号 let num = this.getDays(this.date[0], this.date[1]); if (num < this.date[2]) { this.date.splice(2, 1, num); } }, // 日期点击事件 selectDay(val) { let oVal = this.date[1]; this.date.splice(1, 2, val.month, val.day); if (val.month !== oVal) { this.countDay(); } this.$emit("change", this.date.join("-")); }, // 获取某个月有多少天 getDays(year, month) { // 一年中每个月的天数 let days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; // 判断是不是闰年 2月29天 if (year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)) { days[1] = 29; } return days[month - 1]; }, //左右按钮点击事件 dateOperate(type) { let [y, m, d] = this.date; // 如果是向后翻 if (type === "up") { // 日期向后翻 切换月份 if (this.show === "date") { if (+m === 12) { this.date.splice(0, 1, y + 1); this.date.splice(1, 1, "01"); } else { this.date.splice(1, 1, formatTime(+m + 1)); } // 月份向后翻 切换年份 } else if (this.show === "month") { this.date.splice(0, 1, y + 1); // 年份向后翻 重组数据 } else { this.changeYear("right"); } // 如果是前后翻 } else { // 日期向前翻 切换月份 if (this.show === "date") { if (+m === 1) { this.date.splice(0, 1, y - 1); this.date.splice(1, 1, 12); } else { this.date.splice(1, 1, formatTime(+m - 1)); } // 月份向前翻 切换年份 } else if (this.show === "month") { this.date.splice(0, 1, y - 1); // 年份向前翻 重组数据 } else { this.changeYear("left"); } } this.countDay(); this.checkDay(); }, // 右侧按钮点击事件 weekReport(i) { if (i === 1) return; let arr = [], // 选择一周的数据 开始 s = 7 * (i - 1) - 7, // 结束 e = 7 * (i - 1); // 遍历日数据 截取选择的周数据 for (let k = s; k < e; k++) { arr.push( `${this.dayList[k].year}-${this.dayList[k].month}-${this.dayList[k].day}` ); } this.$emit("weekReport", arr); }, // 看月报事件 changeReport() { let [y, m, d] = this.date; this.$emit("changeReport", `${y}-${m}`); }, // 取消事件 cancel() { this.$emit("cancel"); }, }, computed: {}, watch: { yearList(nVal, oVal) { // 记录每一页显示的数据第一位和最后一位 用于计算下一页或者上一页的数据 this.move.fNum = nVal[0]; this.move.lNum = nVal[11]; }, deep: true, immediate: true, },};</script>
formatTime是给月份和日期小于10的前面加0的方法
本文转载于:
https://juejin.cn/post/7218048201981853757
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
关键词:
-
今日热门!iOS描述文件(.mobileprovision)一键申请
转载:IOS描述文件制作教程iOS描述文件( mobileprovision)一键申请在主界面上点击描述文件按钮。编辑切换
来源: -
vue-router3.x和vue-router4.x相互影响的问题记录
背景项目中有一个系统使用的微前端,主站使用是vue2实现的,使用的是vue-router3 x。子应用有使用vue3实现
来源: 记录-Vue移动端日历设计与实现
今日热门!iOS描述文件(.mobileprovision)一键申请
vue-router3.x和vue-router4.x相互影响的问题记录
许婷律师联系方式_许婷
解锁五一新玩法——第三站:黑龙江·森林氧吧
内地5月26日上映!《小美人鱼》新预告:女主被鲨鱼追杀-天天快资讯
给AI小姐姐留着 西数16TB硬盘到手1549元(非SMR)
5代都玩腻了 5月17日或公布《GTA6》新消息 期待吗? 当前热文
环球观热点:彻底放弃Win7!U盘软件Rufus发布4.0版本
视效大片!《变形金刚7:超能勇士崛起》确认引进内地:预计6月上映
四大会计师事务所排名百科(四大会计师事务所排名)
Java中关于String类以及字符串拼接的问题 世界新动态
低代码是开发的未来,还是只能解决边角问题的鸡肋? 全球热点评
环球播报:有奖征文丨【玩转Cloud Studio】第二季来啦!
ReactNative 桥接原生原子组件(一) 今日热闻
Java程序部署成Windows服务-全球独家
世界即时:台湾拚非核疯绿电 企业买高中培养风电人才
天天观速讯丨【财经分析 】钢厂纷纷减产,钢价能否止跌?
女子淄博买切糕2种口味称重仅6元火了!五一客流量爆满:喊话推荐其他山东城市
中国广电合约机明天上市:iPhone 14最低2586元 全面支持5G|最资讯
并非永久关停!天涯社区官方:会回来的 天天百事通
环球滚动:一加功不可没!OPPO成为中国手机市场Q1安卓销量第一名
速看:杭州、合肥土拍又“火爆”了
患者反复腹痛7年!南华医院一招肠菌移植显奇效-视讯
读书笔记丨远程服务调用和RESTful,如何分析和抉择?
国内公路编码规则
收评:创业板指收涨1.54% 新能源赛道大幅反弹
湖南工学院与衡阳师范学院联合举办2023年“一校一书”阅读推广暨读书节活动开幕式 焦点消息
售价接近110万 网友绘制比亚迪仰望U8改装版:高低也得整一辆|天天热消息
微头条丨安卓之光!小米连续做了4代Ultra:米粉评价“方向对了”
要闻:研究表明咖啡+茶效果更佳:可降低死亡风险 但要适量
热点聚焦:买硬座票跑卧铺睡男子引发热议!他还教育乘务员:提高服务意识
主摄硬件无升级!三星Galaxy S24 Ultra将依靠软件优化拍摄质量
楚天科技:一次性耗材领域已完成质量体系认证,目前已有销售订单
MySQL 安装及配置 当前快看
四级英语冲刺高频500词
在毫秒量级上做到“更快”!DataTester 助力飞书提升页面秒开率
[译]在C#中使用IComparable和IComparer接口 每日短讯
(二)asyncio的简单使用,python异步高效处理数据,asyncio.get_event_loop(),loop.run_until_complete(
全球看点:4月26日西南地区乙醇市场行情震荡整理
大范围降雨将重启 暴雨袭击6省:覆盖五一假期 环球即时看
特斯拉Autopilot每917万公里才一起事故:比人驾安全性高773% 世界新动态
旅美大熊猫“丫丫”将于当地4月26日归国:身体健康状态相对平稳
三星Exynos 2400回归!性能爆发 剑指高通骁龙8 Gen3-世界快讯
世界视点!撕掉油腻 三重功效:凯迪克男士洗面奶280g装19.9元
天天观天下!剪窗花的来历和故事_剪窗花的来历
市场监管总局:对明显违法违规的主播和商家要依法严厉处罚-全球最资讯
旅游不怕价格刺客!淘宝上线海淘“外挂”:拍照找同款比价 热点聚焦
烧烤火出圈 淄博致游客的一封信:客流量已超出接待能力-天天微头条
悲痛!一名8岁女孩脸部遇手机爆炸后身亡 官方正调查
接单日记(一):理解浮点数运算的误差
物业业主联手助力孩子圆梦
俞敏洪:猪周期与人生周期相似 坚守最可贵
全球微动态丨寿司店疑现被煮熟蓝环章鱼 店家要求爆料网友删博:市监局已介入
Web3来了!蚂蚁链宣布开源跨链技术:数字资产互联互通
微软将以690亿美元收购动视暴雪:有望于本周获批|当前热闻
全面实行不动产统一登记制,房产税真的要来了? 全球要闻
【环球速看料】从数据库查询权限信息与自定义失败处理
每日观点:【Excel统计分析插件】上海道宁为您提供统计分析、数据可视化和建模软件——Analyse-it
亿级日活业务稳如磐石,华为云CodeArts PerfTest发布
深入思考右值引用
看点:Java中抽象类和接口的区别?
世界即时:宿州:全市采血点无休 库存现缺A型、o型血
传统车企掀桌子!20.89万起的别克E5太香了:累计订单已超8000份 每日焦点
小鹏P7停车礼让 随后看呆:老奶奶5秒跑过斑马线还竖大拇指-世界微速讯
手机创史上最大降幅 回收成香饽饽:“暴利”超乎想象 焦点消息
天天微头条丨年轻人的首台超联接笔记本 华为MateBook D 14开卖 首销购机享福利
五一小长假来了!滴滴宣布发2亿司机补贴:假期出车流水加速
dota如何踢人?dota怎么设置快捷键?
今日视点:4月26日浙江蓝苏氟化工氢氟酸价格暂稳
半成品加工是什么意思?半成品加工需要办什么证件?
nba fmvp是什么意思?fmvp是怎么评出来的?
50米自由泳世界纪录是多少?50米自由泳一二三级运动员标准
诺基亚5320当年多少钱?诺基亚5320手机参数
苹果一体机怎么开机?苹果一体机电脑型号大全列表
诺基亚820怎么连接电脑?诺基亚820手机参数
当前观点:使用pycuda替换字符串,使用cuda替换字符串
python 使用selenium 不开启浏览器
今日热议:C# 获取系统DPI缩放比例以及分辨率大小
TF-GNN踩坑记录(四) 全球报道
CentOS搭建squid正向代理|当前热门
全球即时:据说,有一群AI数字人将在AWE展会觉醒......
增城是哪里的城市?增城旅游必去十大景点
联通iphone合约机划算吗?联通iphone语音信箱怎么关闭?
电信网络模式有哪几种?电信网络模式怎么设置?
【金融街发布】财政部:3月全国发行地方政府债券8900亿元
守住“头顶上的安全”, 长征镇加强房屋高坠隐患排查整治|当前时讯
微信支付支持数字人民币支付了:视频号、小程序可用
【世界新视野】丰田社长体验中国顶级豪车红旗L5:满脸堆笑、不住称赞
99年女子疑过度劳累宿舍猝死 公司:逝者是临时工
280g新疆长绒棉:Caria Knar纯棉T恤29.99元(减110元)
【全球新视野】NVIDIA推出安全“护栏”:限制人工智能“一本正经的胡扯”
22家上市后备企业蓄势待发!永兴经开区优化营商环境促发展-新视野
Java基础之String字符串的底层原理,面试常见问题
当前速读:error: Your local changes to the following files would be overwritten by me
Java8 教程_编程入门自学教程_菜鸟教程-免费教程分享
天天观焦点:兰州高新区重点项目建设实现一季度开门红
中金湖北科投光谷REIT正式获批 全球信息
全球视讯!华为MateBook D14/D16今日开售:13代酷睿 4999元起
有人姓“苟”:担心孩子受嘲笑而改姓_环球新视野