H5移动端月历区间选择开始月份和结束月份

2023-11-22 11:20

本文主要是介绍H5移动端月历区间选择开始月份和结束月份,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在做h5移动端app时,因业务需要,要做按日区间选择开始和结束日期,按月区间选择开始和结束月份,ui组件中有按日区间选择的,没有按月区间选择,所以结合业务自己写了一个。

<template><van-action-sheetv-model="showDate"position="bottom"@close="closeCalendar"title="选择月份"round:style="{ height: '80%' }"ref="monthDate"><ul class="content"><li v-for="(item, index) in years" :key="index" v-scroll><div class="monthTitle">{{ item.year }}年</div><van-row><van-colspan="6"v-for="(childItem, key) in item.children":key="key":class="childItem.monthClass"><divclass="monthList"@click="selectList(item, childItem)":class="childItem.isSelect === true ? 'isSelect' : ''"><div :class="childItem.disabledMonth == true ? 'isDisabled' : ''">{{ childItem.month }}月</div><divclass="startEnd":class="childItem.text == '开始' || childItem.text == '结束'? 'fontSize': ''">{{ childItem.text }}</div></div></van-col></van-row></li></ul><div class="footBtn" default="footer"><div class="footBox"><van-button @click="onReset" type="primary">重 置</van-button><van-button @click="onConfirm" type="primary">确 定</van-button></div></div></van-action-sheet>
</template><script>
import { Toast } from "vant";
export default {props: {isAllowSameDay: {type: Boolean,},calendarshow: {type: Boolean,},yearLength: {type: Number,},defaultDate: {type: Array,required: true,},},data () {return {years: [],monthList: ["一","二","三","四","五","六","七","八","九","十","十一","十二",],showDate: this.calendarshow,selectArr: [],currentYear: new Date().getFullYear(), //当前年份currentMonth: new Date().getMonth() + 1, //当前月份startDefaultYear: new Date().getFullYear(), //开始年份startDefaultMonth: new Date().getMonth() + 1, //开始月份endDefaultYear: new Date().getFullYear(), //结束年份endDefaultMonth: new Date().getMonth() + 1, //结束月份startText: "开始",endText: "结束",startEndText: "开始/结束"};},directives: {// 自定义指令 月历定位到当前年份scroll: {inserted (el) {el.scrollIntoView();},},},watch: {calendarshow (val) {this.showDate = val; //显示隐藏月历},defaultDate (val) {this.startDefaultYear = val[0].getFullYear(); //开始年份this.startDefaultMonth = val[0].getMonth() + 1; //开始月份this.endDefaultYear = val[1].getFullYear(); //结束年份this.endDefaultMonth = val[1].getMonth() + 1; //结束月份this.setDefaultMonth();},},created () {this.initCalendar()},methods: {// 初始化月历initCalendar () {const that = this;for (let i = 1; i <= that.yearLength; i++) {const item = {year: that.currentYear - (that.yearLength - i),children: [],};for (let j = 0; j < that.monthList.length; j++) {let list = {month: that.monthList[j],isSelect: false,value: j + 1,text: "",};// 判断当前月之后的月份不可选if ((item.year == that.currentYear && j + 1 > that.currentMonth) || (item.year == that.currentYear - (that.yearLength - 1) && j + 1 < that.currentMonth)) {list.disabledMonth = true;} else {list.disabledMonth = false;}item.children.push(list);}that.years.push(item);}},// 设置默认值setDefaultMonth () {const that = this;const startYear = that.startDefaultYear; //默认开始年份const endYear = that.endDefaultYear; //默认结束年份const startMonth = that.startDefaultMonth;  //默认开始的年份const endMonth = that.endDefaultMonth;  //默认开始的年份that.selectArr = [];that.years.map((item) => {item.children.map((list) => {list.text = "";list.isSelect = false;// 当前起始年份、月份都相同if (startYear == endYear && startMonth == endMonth) {list.monthClass = "";if (item.year == startYear && list.value == startMonth) {list.text = that.startEndText;list.isSelect = true;that.monthSaveArr(startYear, startMonth, list.text);}} else {// 起始年份相同、月份不同if (item.year == startYear && list.value == startMonth) {list.text = that.startText;list.isSelect = true;that.monthSaveArr(item.year, list.value, list.text);}if (item.year == endYear && list.value == endMonth) {list.text = that.endText;list.isSelect = true;that.monthSaveArr(item.year, list.value, list.text);}}});});},// 选择的月份存入一个数组中monthSaveArr (year, month, text) {const dataItem = {year: year,month: month,text: text};this.selectArr.push(dataItem);},// 选择月份selectList (item, childItem) {const that = this;const selectStartYear = that.selectArr[0].year; //选择开始的年份const selectStartMonth = that.selectArr[0].month;//选择开始的月份// 大于当前月份不可选if (childItem.disabledMonth == true) {return;}// 开始月份  (如果数组为空 或者 已经选了开始结束月份为同一月) 选择开始月份if (that.selectArr.length == 0 || that.selectArr[0].text == that.startEndText) {that.cancelSelectMonth();childItem.text = that.startText;that.monthSaveArr(item.year, childItem.value, childItem.text);} else if (that.selectArr.length == 1) {if (item.year == selectStartYear && childItem.value == selectStartMonth) {// 开始、结束月份是否可选同一天if (that.isAllowSameDay == true) {childItem.isSelect = true;childItem.text = that.startEndText;that.monthSaveArr(item.year, childItem.value, childItem.text);return;} else {childItem.isSelect = true;childItem.text = that.startText;return;}}// 选择的月份不能超过12个月if ((item.year > this.selectArr[0].year && childItem.value >= this.selectArr[0].month) || (item.year - this.selectArr[0].year > 1)) {Toast("结束月份不能超过12个月");return;}if ((item.year == selectStartYear && childItem.value < selectStartMonth) || item.year < selectStartYear) {that.cancelSelectMonth();childItem.text = that.startText;that.monthSaveArr(item.year, childItem.value, childItem.text);} else {// 结束月份childItem.text = that.endText;that.monthSaveArr(item.year, childItem.value, childItem.text);that.setAreaBackground();}} else if (that.selectArr.length == 2) {that.cancelSelectMonth();childItem.text = that.startText;that.monthSaveArr(item.year, childItem.value, childItem.text);}childItem.isSelect = !childItem.isSelect;},// 取消已选中的月份cancelSelectMonth () {this.selectArr = [];this.years.map((item) => {item.children.map((ev) => {ev.text = "";ev.isSelect = false;ev.monthClass = "";});});},// 添加开始、结束区间的背景颜色setAreaBackground () {const startYear = this.selectArr[0].year; //开始年份const endYear = this.selectArr[1].year;   //结束年份const startMonth = this.selectArr[0].month; //开始年份const endMonth = this.selectArr[1].month;   //结束年份this.years.map((item) => {// 起始年份相同if (item.year == startYear && item.year == endYear) {item.children.map((ev) => {if (endMonth - startMonth >= 1) {if (ev.value == startMonth) {ev.monthClass = "calendarStartColor";} else if (ev.value == endMonth) {ev.monthClass = "calendarEndColor";} else if (ev.value > startMonth && ev.value < endMonth) {ev.monthClass = "calendarMiddleColor";}}})} else if (endYear > startYear) {// 开始年份小于结束年份if (item.year == startYear) {// 起始月份item.children.map((ev) => {if (ev.value == startMonth) {ev.monthClass = "calendarStartColor";} else if (ev.value > startMonth) {ev.monthClass = "calendarMiddleColor";}})} else if (item.year == endYear) {// 结束月份item.children.map((ev) => {if (ev.value == endMonth) {ev.monthClass = "calendarEndColor";} else if (ev.value < endMonth) {ev.monthClass = "calendarMiddleColor";}})} else if (item.year > startYear && item.year < endYear) {// 开始月份与结束月份区间的加背景色item.children.map((ev) => {ev.monthClass = "calendarMiddleColor";})}}});},// 确认onConfirm () {this.$emit("confirmMonth", this.selectArr);},// 重置日期onReset () {this.$emit("resetCalendar");},// 关闭closeCalendar () {this.$emit("closeCalendar");}}
};
</script><style lang="stylus" scoped>
/deep/.van-action-sheet__close {right: auto;left: 0px;
}
/deep/.van-action-sheet__header{font-size: 1rem;font-family: PingFang SC;font-weight: bold;color: #333333;
}
.content {font-family: PingFang SC;padding-bottom: 84px;/deep/.van-row {padding: 1.11rem 0 0 0;}/deep/.van-col--6 {margin-bottom: 1.11rem;position: relative;}.calendarStartColor{background-image: linear-gradient(to right, #fff , #e6f5fc);}.calendarEndColor{background-image: linear-gradient(to left,#fff , #e6f5fc);}.calendarMiddleColor {background-color: #e6f5fc;}.monthTitle {background: #E5E5E5;font-size: 0.83rem;font-weight: bold;color: #333333;padding: 0.61rem 0;}.monthList {width: 3rem;height: 2.22rem;display: flex;flex-flow: column;color: #333333;justify-items: center;align-items: center;border-radius: 0.56rem;margin: 0 auto;padding: 0 0.22rem 0.22rem 0.22rem;div:first-child {height: 0.81rem;line-height: 0.81rem;padding: 0.44rem 0 0.22rem 0;font-size: 0.89rem;font-weight: 500;}.startEnd {height: 0.61rem;line-height: 0.61rem;font-size: 0.53rem;font-weight: 500;color: #FFFEFE;}.fontSize {font-size: 0.61rem;}div {display: flex;flex-flow: row;}}.isDisabled {color: #ccc;}.isSelect {background: #0097E0;color: #fff;}
}.footBtn {position: fixed;bottom: 0;width: 100%;padding: 0.66rem 0 1.53rem 0;display: flex;background: #fff;.footBox {padding: 0 16px;display: flex;flex-flow: row;width: 100%;}.van-button {border-radius: 2rem;height: 2.5rem;line-height: 2.5rem;flex: 1;margin: 0 1rem;font-size: 1rem;}.van-button:nth-child(1) {width: 80%;color: #000;font-size: 14px;background: white;border: 2px solid #666 !important;border-radius: 40px;margin: 0 1rem;}.van-button:nth-child(2) {width: 80%;color: #fff;font-size: 14px;background: white;border-radius: 40px;margin: 0 1rem;border: none;background: -webkit-gradient(linear, right top, left top, from(#0068b7), to(#0097e0));background: linear-gradient(-90deg, #0068b7, #0097e0);}
}
</style>

组件引用

<month-filter :defaultDate="monthDate.monthDefaultDate" :calendarshow="monthDate.monthCalendarShow" :isAllowSameDay="monthDate.isAllowSameDay" :yearLength="monthDate.yearLength" @closeCalendar="monthDate.monthCalendarShow = false" @confirmMonth="selectMonth" @resetCalendar="resetMonthCalendar">
</month-filter>monthDate:{monthCalendarShow:false,yearLength:10,monthDefaultDate:[new Date(), new Date() //设置区间  ],isAllowSameDay:true     // 可选同一个月份
},// 选择月份区间
selectMonth(data) {if(data.length ==2 ){// 这里是获取的开始和结束的值}else if(data.length==1){if(data[0].text !="开始/结束"){Toast("请选择正确的月份区间");return;}else{// 这里是开始和结束的月份相同}}this.monthDate.monthCalendarShow = false;
},resetMonthCalendar(){ //重置月份}

 按月区间选择组件还可优化,欢迎大家给出意见,谢谢!

效果图如下:

开始月份到结束月份

 开始结束月份可选当月:

 

这篇关于H5移动端月历区间选择开始月份和结束月份的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/409762

相关文章

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

双系统电脑中把Ubuntu装进外接移动固态硬盘的全过程

《双系统电脑中把Ubuntu装进外接移动固态硬盘的全过程》:本文主要介绍如何在Windows11系统中使用VMware17创建虚拟机,并在虚拟机中安装Ubuntu22.04桌面版或Ubunt... 目录一、首先win11中安装vmware17二、磁盘分区三、保存四、使用虚拟机进行系统安装五、遇见的错误和解决

exfat和ntfs哪个好? U盘格式化选择NTFS与exFAT的详细区别对比

《exfat和ntfs哪个好?U盘格式化选择NTFS与exFAT的详细区别对比》exFAT和NTFS是两种常见的文件系统,它们各自具有独特的优势和适用场景,以下是关于exFAT和NTFS的详细对比... 无论你是刚入手了内置 SSD 还是便携式移动硬盘或 U 盘,都需要先将它格式化成电脑或设备能够识别的「文

使用FileChannel实现文件的复制和移动方式

《使用FileChannel实现文件的复制和移动方式》:本文主要介绍使用FileChannel实现文件的复制和移动方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录使用 FileChannel 实现文件复制代码解释使用 FileChannel 实现文件移动代码解释

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

基于Python实现多语言朗读与单词选择测验

《基于Python实现多语言朗读与单词选择测验》在数字化教育日益普及的今天,开发一款能够支持多语言朗读和单词选择测验的程序,对于语言学习者来说无疑是一个巨大的福音,下面我们就来用Python实现一个这... 目录一、项目概述二、环境准备三、实现朗读功能四、实现单词选择测验五、创建图形用户界面六、运行程序七、

前端知识点之Javascript选择输入框confirm用法

《前端知识点之Javascript选择输入框confirm用法》:本文主要介绍JavaScript中的confirm方法的基本用法、功能特点、注意事项及常见用途,文中通过代码介绍的非常详细,对大家... 目录1. 基本用法2. 功能特点①阻塞行为:confirm 对话框会阻塞脚本的执行,直到用户作出选择。②

Python重命名文件并移动到对应文件夹

《Python重命名文件并移动到对应文件夹》在日常的文件管理和处理过程中,我们可能会遇到需要将文件整理到不同文件夹中的需求,下面我们就来看看如何使用Python实现重命名文件并移动到对应文件夹吧... 目录检查并删除空文件夹1. 基本需求2. 实现代码解析3. 代码解释4. 代码执行结果5. 总结方法补充在

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J