最新要闻
- 新美男记_关于新美男记简介
- 当前资讯!高考考生们这些“套路”骗局要当心:千万别信
- 环球观热点:小哥十米高跳江救人!老家张家界奖励10万元外加一套房
- 16针显卡供电接口闯大祸!第一次把电源烧了
- 全球实时:HDD硬盘被垄断 倪光南院士:SSD取代的时机到了
- iPhone 15 Pro Max影像这下拉满了!看不到短板
- 景区观光车这价格,吃相太难看了
- 环球热讯:两部门印发文件部署高校毕业生档案转递接收工作
- 国网集安市供电公司:开展端午节前作风建设监督检查
- 世界要闻:比法拉利更抢眼!理想设计师亲自“泄密” W01设计手稿公布
- 苦中作乐!广东暴雨积水成河:有人屋内钓鱼 外卖车成水上摩托-当前滚动
- 快报:顾客遇账单刺客8碗米饭要90元 餐厅反驳:为了拍段子蹭流量
- 热到怀疑人生!今年“烧烤模式”来得早
- 每日视讯:RTX 4080显卡杀到8399元 铭瑄618全程价保:硬核装备开抢
- FOreverLove什么意思中文
- 今日视点:胸部怎样才算不下垂_胸部怎样才能变大
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
记录--设计一个可选择不连续的时间范围的日期选择器
(资料图片仅供参考)
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
- npm包:sta-datepicker
- 效果图
需求
普通的时间选择器要么只能单选,要么只能选范围,不可以随意选择若干个时间,同时大多数现成的时间选择器选择结束会收起来,很不方便。现在需求如下 1、可以自己控制展开收起 2、可以选择不连续的多个时间范围的日期 3、可以批量选中日期,不需要一个个点击
实现过程(分几个步骤,具体可以看源码)
1、生成一个日历
顶部为固定的几个按钮,可以绑定切换年份月份的函数
中间为固定的星期,一个七个
底部为具体日期,由三部分组成,即:上个月底几天,这个月整个月,下个月初几天
- 算好平年闰年,输出当前月份第一天是周几
- 根据当前月份的第一天的星期数,计算日历要展示上个月月底的几天
- 根据当前月份最后一天的星期数,计算日历要展示下个月月初的几天
日期部分使用div遍历三个数组,左浮动或者弹性盒直接堆起来即可
created() { this.trueDateBox() }, methods: { trueDateBox() { if (this.date === "") { const date = new Date() this.year = date.getFullYear() this.updateLeapYear() this.month = date.getMonth() + 1 this.day = null } this.dayScreen() }, // 设置算好闰年平年 updateLeapYear() { if (this.isLeapYear(this.year)) { this.monthDay[1] = 29 } else { this.monthDay[1] = 28 } }, isLeapYear(year) { return year % 100 === 0 ? year % 400 === 0 : year % 4 === 0 }, // 日期显示 dayScreen() { // 渲染上个月,第一行 const firstDate = new Date(this.year, this.month - 1, 1) const firstWeek = firstDate.getDay() let preMonthDay = null if (this.month === 1) { preMonthDay = this.monthDay[11] } else { preMonthDay = this.monthDay[this.month - 2] } console.log("preMonthDay", this.monthDay[11], this.month) for (let i = 0; i < preMonthDay; i++) { this.previousMonth[i] = i + 1 } if (firstWeek === 0) { this.previousMonth = this.previousMonth.slice(-7) } else { this.previousMonth = this.previousMonth.slice(-firstWeek) console.log(33, this.previousMonth) } // 渲染下个月, 最后一行 const endDate = new Date( this.year, this.month - 1, this.monthDay[this.month - 1] ) const endWeek = endDate.getDay() let nextMonthDay = null if (this.month === 12) { nextMonthDay = this.monthDay[0] } else { nextMonthDay = this.monthDay[this.month] } for (let i = 0; i < nextMonthDay; i++) { this.nextMonth[i] = i + 1 } if (endWeek === 6) { this.nextMonth = this.nextMonth.slice(0, 7) } else { this.nextMonth = this.nextMonth.slice(0, 6 - endWeek) } }, }
2、绑定四个固定的函数
- 点击上一年,下一年,上个月,下个月时,需要计算跨年的情况
// 年份的增减 addYear() { this.year++ this.updateLeapYear() }, reduceYear() { this.year-- this.updateLeapYear() }, // 月份的增减 addMonth() { this.month++ if (this.month > 12) { this.month = 1 this.addYear() } }, reduceMonth() { this.month-- if (this.month < 1) { this.month = 12 this.reduceYear() } },
3、点击具体日期时,确定状态
- 使用数组存起当前已选的日期,使用一个变量记录当前半选的日期
- 通过一个函数
isActive
给每个日期绑定类名,从而在视图上显示出来,同时可以确定状态的切换- 如果点击了已选日期的数据,需要剔除,改为空白状态
- 如果点击了半选态日期,则直接选中当前日期,变为已选日期
- 如果点击了空白状态日期,则可能有两种情况,一是已存在半选态日期,等待闭合,而是不存在半选态日期,当前设置为半选
methods: { // 突出显示当前日期 isActive(index) { const date = new Date() const y = date.getFullYear() const m = date.getMonth() + 1 const d = date.getDate() const obj = {} if (this.year === y && this.month === m && index === d) { obj.today = true } const newIndexStr = index < 10 ? `0${index}` : `${index}` const newMonthStr = this.month < 10 ? `0${this.month}` : `${this.month}` const item = `${this.year}/${newMonthStr}/${newIndexStr}` if (item === this.partialSelect) { obj.active = true } if (this.selctDate.includes(item)) { obj.activeRange = true } return obj }, selectDay(e, type) { const iText = e.target.innerText const sDate = Number(iText) < 10 ? `0${iText}` : `${iText}` if (type === "previousMonth") { if (this.month === 1) { this.month = 12 this.reduceYear() } else { this.month = this.month - 1 } } else if (type === "nextMonth") { if (this.month === 12) { this.month = 1 this.addYear() } else { this.month = this.month + 1 } } let arr = this.selctDate.map((i) => new Date(i).getTime()) const newMonthStr = this.month < 10 ? `0${this.month}` : `${this.month}` const curSelectTime = `${this.year}/${newMonthStr}/${sDate}` const curSelectTimeStamp = new Date(curSelectTime).getTime() const clsName = e.target.className // 通过类名判断当前是什么状态 if (clsName.includes("activeRange")) { // 点击了范围内的数据,需要剔除 arr = arr.filter((i) => i !== curSelectTimeStamp) } else if (clsName.includes("active") && !clsName.includes("activeRange")) { // 点击了一个半选状态的日期,准备扩展范围或者单选一个 if (this.selctDate.length) { const itemTime = arr[0] const itemTime2 = arr[arr.length - 1] const selectTime = curSelectTimeStamp if (selectTime < itemTime) { console.log("点击了范围之前的时间") } else if (selectTime > itemTime2) { console.log("点击了范围之后的时间") } else { console.log("点击了范围内的空白,直接加上一个") } arr = [...arr, curSelectTimeStamp] console.log(arr) } else { // 第一次选择日期,而且双击了,直接单独确定这个 arr = [curSelectTimeStamp] } // 此时选择完日前了,半选的日期消费掉了,清空 this.partialSelect = null } else { console.log("不是半选情况") // 即没有点击范围内,又不是半选状态,可能是已经存在一个半选,等待这个日期来闭合范围,也可能是第一次打开点击 if (this.partialSelect) { // 需要和已存在的半选态日期闭合 const itemTime = new Date(this.partialSelect).getTime() const itemTime2 = curSelectTimeStamp const timeArr = [itemTime, itemTime2].sort((a, b) => a - b) // 排序,因为不知道谁在前面 for (let i = timeArr[0]; i <= timeArr[1]; i += 86400000) { arr.push(i) } // 此时确定好范围了,半选的日期消费掉了,清空 this.partialSelect = null } else if (this.selctDate.length) { // 存在一个范围,同时点击范围外,此时设置半选 this.day = sDate this.partialSelect = curSelectTime } else { // 不存在一个范围,所以是第一次点击 this.day = sDate this.partialSelect = curSelectTime } } let filterArr = Array.from(new Set(arr)) filterArr = filterArr.sort((a, b) => a - b) this.selctDate = filterArr.map((i) => this.formatTime(new Date(i))) this.$emit("input", this.selctDate) this.$emit("change", this.selctDate) this.day = parseInt(sDate) },}
本文转载于:
https://juejin.cn/post/7240088790423863353
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
关键词:
-
即时焦点:曝光!Apache SeaTunnel Catalog 功能设计为何能大大简化用户启用步骤?
![file](https: img2023 cnblogs com other 3195851 202306 3195851-2
来源: 记录--设计一个可选择不连续的时间范围的日期选择器
聊聊Flink的必知必会(三)
【活动访谈】发力数字基座 推动物联创新—航天科技控股集团AIRIOT4.0平台发布会活动专访 天天短讯
即时焦点:曝光!Apache SeaTunnel Catalog 功能设计为何能大大简化用户启用步骤?
财政部:1-5月全国一般公共预算收入同比增长14.9% 一般公共预算支出同比增长5.8%
新美男记_关于新美男记简介
当前资讯!高考考生们这些“套路”骗局要当心:千万别信
环球观热点:小哥十米高跳江救人!老家张家界奖励10万元外加一套房
16针显卡供电接口闯大祸!第一次把电源烧了
全球实时:HDD硬盘被垄断 倪光南院士:SSD取代的时机到了
iPhone 15 Pro Max影像这下拉满了!看不到短板
景区观光车这价格,吃相太难看了
环球热讯:两部门印发文件部署高校毕业生档案转递接收工作
Kubernetes 1.27.2集群安装|每日热讯
单体服务,微服务服务的演变 & 各自优缺点
世界观焦点:javaScript基础语法之正则表达式
国网集安市供电公司:开展端午节前作风建设监督检查
世界要闻:比法拉利更抢眼!理想设计师亲自“泄密” W01设计手稿公布
苦中作乐!广东暴雨积水成河:有人屋内钓鱼 外卖车成水上摩托-当前滚动
快报:顾客遇账单刺客8碗米饭要90元 餐厅反驳:为了拍段子蹭流量
热到怀疑人生!今年“烧烤模式”来得早
每日视讯:RTX 4080显卡杀到8399元 铭瑄618全程价保:硬核装备开抢
FOreverLove什么意思中文
全球热门:远程办公篇-vscode远程SSH开发
和必应对话之mysql分区分表
天天日报丨位运算与集合
镜像,容器,容器数据卷,DockerFile 相关命令 使用总结 全球资讯
今日视点:胸部怎样才算不下垂_胸部怎样才能变大
全球今日讯!Facebook首席AI专家表示, 大语言模型只是昙花一现
好多明星去看了梅西比赛:陈妍希、苏醒等人都在现场_全球快播
世界看热讯:余承东:比亚迪是未来能活下来的巨头之一 华为能帮车企活下来
余承东:问界M5智能驾驶能力全球第一 超越特斯拉、国内外所有同行 天天快播
李一男造车梦“复活”自由家NV换标大乘V07已通过工信部申报
全球要闻:一口降温夏日必备!迷你可爱多冰淇淋官旗发车:每支不到1块钱
【天天速看料】邓一杰:黄金破1962,保守调仓,激进持仓!
当前头条:冬天适合在室内养什么植物_冬天室内养什么植物好 冬天适合室内种植的植物介绍
梅西ins发文感谢中国粉丝:开场81秒就进球 打破职业生涯记录 快看点
离谱!代驾设套碰瓷13名代驾同行:故意选土路蹭底盘 世界快消息
梅西直播被吐槽广告多?回应来了:纯聊天 没有带货_每日热议
苹果iPhone为何只有27W充电?原因可能有三 焦点速读
韩媒:韩国年轻人迷上中国App无法自拔 实在太好用了-全球讯息
速看:液冷概念股震荡走高 飞龙股份拉升封板
天天微头条丨CHAT-GPT初使用
唐源电气6月16日盘中跌幅达5%
男子突发奇想将甜瓜和西瓜嫁接 网友看完大笑:这是焊接_每日观察
环球观焦点:交通拥堵为何不禁私家车?这座一线城市要限电动自行车 只是试运行 专家吐槽
罕见!巨鸟撞碎玻璃卡在飞机舱,飞行员满脸血仍淡定驾驶……_全球今热点
热点!从0开始,精通Go语言Rest微服务架构和开发
Apache Spark教程_编程入门自学教程_菜鸟教程-免费教程分享
Qt+QtWebApp开发笔记(六):http服务器html实现静态相对路径调用第三方js文件
【环球聚看点】实力登场 汉马动力携四款动力产品亮相上海GPOWER 2023动力展
陕西加强养老服务设施规划建设新建城区 新建居住(小)区配建养老服务设施
员工没完成业绩被罚吃苦瓜 公司:激励团队 都是自愿的
最新消息:买2套到手23件:黑人好来超白茶牙膏套装5支39.9元
坦克300坐不住了 全新一代北京BJ40曝光 你会选谁?
环球观热点:RTX轻薄本怎么选?不妨看看这三款:13499元的华硕灵耀Pro14 2023无可挑剔
世界观察:维珍银河计划月底进行首次商务飞行:数百名旅客将上太空
车祸轻伤害要求赔偿多少
每日快看:MySQL索引优化与查询优化
直播源码搭建平台技术知识:实时语音识别字幕呈现功能
有没有类似天龙八部的游戏_类似天龙八部的网络游戏|当前报道
赤座茜出场_赤座茜
滴滴发布橙意保障计划:9成网约车司机月均抽成低于20%
私人山庄被网红闯入并造谣为鬼屋吓得房主不敢回了 网友:请严惩_热闻
梅西回应被迫“宅”酒店 酒店外的球迷太疯狂:感谢所有中国球迷 环球资讯
新资讯:问界M5智驾版交付 首位女车主还是兰博基尼、劳斯莱斯车主
两月没开电池报废不保修?极氪电池质保权益升级:砍掉不合理条约
prscrn键在惠普键盘上哪个位置(prscrn)
雪佛兰萨博班,出演1750部电影的明星车,磁力悬挂控制系统-天天短讯
视频编码耗时长、编码帧发送失败…DVPP视频编码问题典型案例分析
形式化分析之BAN逻辑
什么是SEO
当前滚动:国家发展改革委:统调电厂存煤达到历史新高 今年迎峰度夏电力保供有坚实的基础
全球微头条丨国家发改委:今年迎峰度夏电力保供有坚实基础
每日简讯:盐碱地治理之“沽源方案”
真叫“翔龙”了 哈弗全新插混SUV亮相:形似老卫士、搭载Hi4电四驱|世界热闻
女生摆摊卖鸡脚边卖边吃 网友:吃饱了收摊回家
二代骁龙8平板来了:后置双摄、全金属机身设计-世界关注
Win11新文件管理器砍掉部分功能!微软:大众用户不常用 天天新视野
全球讯息:供应链大佬发话!博世中国总裁:汽车企业做手机是吃饱了没事干
蓝色协议职业推荐 最强职业选择攻略[多图]
新消息丨驻马店市西平县大宗秋粮作物播种基本结束
珊子直播(珊子)_世界报道
奔驰新GLA怎么样及奥迪RS5怎么样
天天观点:在南极尿尿会被冻住吗?
特斯拉开启大促:Model 3后轮驱动版补贴8千元 贷款利率优惠 全球聚焦
权威媒体:不带偏见去看 中国相机镜头已开始超越日本厂商_世界最新
Win11+鸿蒙 618组队出击 华为MateBook E系列二合一笔记本实现年轻人Office自由
别以赚钱为目标 及时行乐!张朝阳对年轻人喊话:在网上做个体职业者挺好
2023年6月郑州人才公寓申请时间具体什么时候开始?
世界球精选!真人版电影《芭比》确认引进 北美于7月21日上映
Spring Boot 实现定时任务动态管理,太爽了! 头条
当前讯息:【一步步开发AI运动小程序】十二、自定义一个运动分析器,实现计时计数01
微动态丨各地计划生育宣传标语大全_最新计划生育宣传标语口号大全
男生中考忘涂机读卡妈妈崩溃大哭 让人心疼:网友疑惑这怎么会忘? 新要闻
零刻GTR7迷你主机618大促:R7 7840HS只要2680元
斐济群岛发生7.2级地震 预计不会发生海啸 新资讯
Bungie程序员批暴雪太懒|焦点简讯
焦点速读:不寒而栗!英美团队称创造出全球首个合成人类胚胎模型 无需精子和卵子
联想小新Pro 2023酷睿版直降700元 32GB内存超大杯5599元