效果图:
1. 功能大致如下(头部有三种布局,可以传入不同的参数去决定)
1.1 点击单选(或者禁用点击选择事件,默认选中当天~ 就当做是一个普通的日历)
1.2 点击多选(可以选择多天的日期,仅能选择当前月的日期)
1.3 点击多选框选择对应的一整列日期
1.4 点击头部展示日期选择器选择年月
2. 实现基本的日期渲染
2.1 思路
2.1.1 要用到的Date对象方法
new Date(2021, 10, 1).getDay() 计算传入的日期是星期几,返回值0表示星期天,1表示星期一,往后推
这里生成 th 的周日到周一,如果 firstDayOfWeek 等于0 则让其等于7
new Date(2021, 10, 0).getDate()计算传入月份的该月总天数,第三个参数为0才是计算总天数!!
2.1.2 日期的结构
1. 首先一个日期表格有六行七列,总共42个日期。
2. 一般情况都分为上个月,本月,下个月共三个月的日期展示,但是有一种特殊情况是本月第一天是星期天,那么我们就只需要展示本月和下一月的日期。
3. 还有注意在每年的1月和12月,它们分别的上一个月和下一个月的年份都应该 -1 和 +1
2.1.3 计算下一个月的日期
- 当前日期总共42个减去该月天数再减去
n-1,就得到下个月要展示的天数 - 循环添加日期:循环起始:1,循环结束:<= 第一步结果
2.1.4 生成年和月
格式化时间方法
2.1.5 生成要渲染的年月
定义 handleGetDays 函数,接收4个参数 年、月、周起始日、时间格式
将准备好的 showDays 传给 handleFormatDates 函数去做二维数组处理
2.1.6 接下来就是点击选择日期
/**
- @param item 日期数据
- @param line 当前行
- @param curLattice 当前点击的方格 */
2.1.7 点击上一月或者下一个月和今天
定义 handleQuickChange 函数接收一个 type 参数
2.1.8 点击多选框选择对应的列的日期
这里要将点击的多选框对应的列的日期追加到一个数组中,使得选中的日期都高亮,然后过滤掉不是当前月的日期,将日期值都给追加进 selectArr 数组中,打散 selectArr 数组追加到 selectedDates 中,selectedDates为选中的日期数组,用来返回给调用者用的,如果多选框的值为 false ,则反选在selectedDates中删掉,选中状态变为不选中。
设置类名
2.1.9 监听回显的日期
将回显值做去重的处理后,先取消当天的日期,如果有选择在给它加上,如果没有回显数据则没有选中的日期,如果选中的日期中有一列的都选中则对应的多选框勾上,使选中的日期高亮处理,最后还要重新生成二维数组做渲染。这里代码太长没有截出来,有需要可以找我拿好兄弟。
2.1.8 监听当前年月的变化,重新生成新的年月渲染
最后将选中的日期返回给调用者使用
最后大佬们有满足不了你的业务场景的可以自己去加功能,有问题可以一起讨论,初入前端坑,还需多多经历社会的毒打。谢谢大佬们给小弟点个赞。