用于订货的日历选择组件(点击多选日期和选择多选框选择对应一列)

1,040 阅读3分钟

效果图:

image.png

1. 功能大致如下(头部有三种布局,可以传入不同的参数去决定)

1.1 点击单选(或者禁用点击选择事件,默认选中当天~ 就当做是一个普通的日历)

1.2 点击多选(可以选择多天的日期,仅能选择当前月的日期)

1.3 点击多选框选择对应的一整列日期

1.4 点击头部展示日期选择器选择年月

2. 实现基本的日期渲染

2.1 思路

2.1.1 要用到的Date对象方法

new Date(2021, 10, 1).getDay() 计算传入的日期是星期几,返回值0表示星期天,1表示星期一,往后推

image.png

image.png

image.png

这里生成 th 的周日到周一,如果 firstDayOfWeek 等于0 则让其等于7

image.png

new Date(2021, 10, 0).getDate()计算传入月份的该月总天数,第三个参数为0才是计算总天数!!

image.png

2.1.2 日期的结构

1. 首先一个日期表格有六行七列,总共42个日期。
2. 一般情况都分为上个月,本月,下个月共三个月的日期展示,但是有一种特殊情况是本月第一天是星期天,那么我们就只需要展示本月和下一月的日期。
3. 还有注意在每年的1月和12月,它们分别的上一个月和下一个月的年份都应该 -1 和 +1

image.png

image.png

image.png

image.png

2.1.3 计算下一个月的日期

  1. 当前日期总共42个减去该月天数再减去n-1,就得到下个月要展示的天数
  2. 循环添加日期:循环起始:1,循环结束:<= 第一步结果

image.png

2.1.4 生成年和月

image.png

格式化时间方法

image.png

2.1.5 生成要渲染的年月

定义 handleGetDays 函数,接收4个参数 年、月、周起始日、时间格式

image.png

image.png

将准备好的 showDays 传给 handleFormatDates 函数去做二维数组处理

image.png

2.1.6 接下来就是点击选择日期

/**

  • @param item 日期数据
  • @param line 当前行
  • @param curLattice 当前点击的方格 */

image.png

image.png

2.1.7 点击上一月或者下一个月和今天

定义 handleQuickChange 函数接收一个 type 参数

image.png

2.1.8 点击多选框选择对应的列的日期

这里要将点击的多选框对应的列的日期追加到一个数组中,使得选中的日期都高亮,然后过滤掉不是当前月的日期,将日期值都给追加进 selectArr 数组中,打散 selectArr 数组追加到 selectedDates 中,selectedDates为选中的日期数组,用来返回给调用者用的,如果多选框的值为 false ,则反选在selectedDates中删掉,选中状态变为不选中。

image.png

image.png

设置类名

image.png

2.1.9 监听回显的日期

将回显值做去重的处理后,先取消当天的日期,如果有选择在给它加上,如果没有回显数据则没有选中的日期,如果选中的日期中有一列的都选中则对应的多选框勾上,使选中的日期高亮处理,最后还要重新生成二维数组做渲染。这里代码太长没有截出来,有需要可以找我拿好兄弟。

2.1.8 监听当前年月的变化,重新生成新的年月渲染

image.png

最后将选中的日期返回给调用者使用

image.png

最后大佬们有满足不了你的业务场景的可以自己去加功能,有问题可以一起讨论,初入前端坑,还需多多经历社会的毒打。谢谢大佬们给小弟点个赞。