日期选择组件(DatePicker)的实现
一、效果图
日期选择组件大概长这样:

从效果图可以看出,日期选择组件由两部分组成:日历表格和顶部操作栏。
二、日历表格
日期选择组件的核心主体是日历表格:

可以将日历表格表示成一个7️*的二维数组,数组中的每一项为一个日期。
一个月有28/29/30/31天,一个星期有7天,最极端的情况,日历数组是一个7️4的二维数组,大部分月份都是7️5或者7️6的二维数组。
不妨假设数组的列是6,非当月的日期用上一月/下一月的日期代替。
从今天出发,获取今天所在月的日历数组。
获取指定日期所在月的日历数组
1.要获取当前月的日历数组,只需要获取每一周的周数组,按照之前的假设一共6周,循环6次,将每一周的周数组合在一起就是月数组。
2.获取第一周的周数组,需要先获取今天所在月的第一天firstDayOfMonth,这样就可以知道第一周的第一天,一周7天,循环7次,就得到第一周的周数组。
3.同理可得之后6周的周数组。
4.最终得到当月的日历数组,具体算法如下:

通过以上方法,给定任意一个日期,可以得到当月的日历数组。
比如:getCalendarArr(‘2018-09-27’)得到的是[[‘2018-08-26’, ‘2018-08-27’, …, ‘2018-09-01’], …, [‘2018-09-30’, …, ‘2018-10-06’]]
其中用到的获取周数组的代码如下:

给定任意日期,可以获取其第num周(对于月日历来说一共6周)的周数组。
比如:getWeekArr(‘2018-09-27’, 0)得到的是[‘2018-09-23’, ‘2018-09-24’, …, ‘2018-09-29’]
而getWeekArr(‘2018-09-27’, 1)得到的是[‘2018-09-30’, ‘2018-10-01’, …, ‘2018-10-06’]
由日历数组生成日历表格
得到了日历数组,要生成日历表格就是轻而易举的事情。

具体效果如下:

增加日期点击操作

点击某个日期可以输出该日期。
三、顶部操作栏
主要包括切换上一年/上一月/下一月/下一年这几个操作和当前年月的展示。
获取下一月的日历数组
只需要把getCalendarArr中的date参数变成下个月的日期就好,moment中有一个函数可以实现:
date.add(1, ‘months’)
同理上一月的就是:date.add(-1, ‘months’)
同理下一年的就是:date.add(1, ‘years’)
组件源码链接:
日期选择组件
日期选择组件(DatePicker)的实现的更多相关文章
- 支付宝小程序日期选择组件datePicker封装
github 地址 https://github.com/iocool/antminDatePicker 最近在做支付宝小程序(以下简称小程序)开发,发现小程序的日期选择组件很不好用,比如安卓和IOS ...
- sencha:日期选择组件datepicker
来源于<sencha touch权威指南> ------------------------------- 除app.js外,其它内容都与上一篇博客里的内容相同.app.js代码如下: E ...
- react-native DatePicker日期选择组件的实现
本教程的实现效果如下: 为了实现其淡入/淡出的覆盖效果, 还有取消按钮, 在此用了一个三方的组件, 大家可以先安装一下: 三方组件的地址:https://github.com/eyaleizenber ...
- antd-mobile的DatePicker日期选择组件使用
现在项目上有个需求,在时间选择上需要精确到分钟,且分钟只能是0分钟或者是30分钟. 使用了antd-mobile的DatePicker组件,具体用法可参考:https://mobile.ant.des ...
- Ant Design 日期选择组件RangePicker 选择时间范围后计算范围内的天数。
/** *需求:同年同月,同年不同月(两个月相减大于1,小于1),不同年(两个年相减大于1(是否为闰年),小于1),起止包含的月份及天 */ //首先引入组件 import { DatePicker} ...
- My97DatePicker -- 一个功能丰富, 而且兼容 ie 6, 7的日期选择组件
easyUI 也提供了 功能强大的日期组件, 可惜在ie 6,7,8下会报错,没有找到 addEventListener , JSON, 可能现在不想再支持低版本ie了 另外avalon也提供了 日 ...
- vue 移动端日期选择组件 vue-mobile-calendar
vue-mobile-calendar cnpm install vue-mobile-calendar -S import Vue from 'vue' import Calendar from ' ...
- 页面日期选择控件--jquery ui datepicker 插件
日期选择插件Datepicker是一个配置灵活的插件,我们可以自定义其展示方式,包括日期格式.语言.限制选择日期范围.添加相关按钮以及其它导航等.官方地址:http://docs.jquery.com ...
- element-ui日期组件DatePicker设置日期选择范围Picker Options
element-UI提供了DatePicker日期选择器组件,可以让我们很方便的获取到日期,默认的选择是全部的日期都可以选择的,但是很多场景中我们要对日期选择范围做限定,比如出行日期就不能选过去的日期 ...
随机推荐
- PLC模拟量输入和数字量输入是什么
数字信号输入输出: 就是开关闭合,断开. 模拟量输入输出: 就是一个数值.比如:液位1.5米,温度30度,这样的数. 输入单元 输入单元是PLC与被控设备相连的输入接口,是信号进入PLC的桥梁,它的作 ...
- MONGODB02 - MongoSocketWriteException 异常会迟到,但从不缺席
接上一个<MONGODB01 - Prematurely reached end of stream 错误定位及修复>处理完成之后,又报错了,场景也是一段时间不访问MongoDB,突然访问 ...
- uniapp微信授权操作后事件不触发
微信小程序官网代码 <button form-type="submit" open-type="getUserInfo" bindgetuserinfo= ...
- Ros中创建msg和srv遇到的问题
在创建msg和srv文件之后,使用srv和msg文件时候需要对xml文件进行修改,如下: <build_depend>message_generation</build_depend ...
- 老师问学生while判断
老师问学生,这道题你会做了吗?如果学生答"会了(y)",则可以放学.如果学生不会做(n),则老师再讲一遍,再问学生是否会做了...... (1)直到学生会为止,才可以放学. (2) ...
- Grafana+Prometheus+node_exporter监控,Grafana无法显示数据的问题
环境搭建: 被测linux机器上部署了Grafana,Prometheus,node_exporter,并成功启动了它们. Grafana中已经创建了Prometheus数据源,并测试通过,并且导入了 ...
- php判断用户设备类型
最近做的一个需求里面希望能判断用户访问页面的设备类型,根据不同的类型去加载不同的数据和页面样式.由于技术栈是使用的php,于是考虑在php层面去做这个判断. 假设主要判断的设备有平板和手机为主,分两个 ...
- Luogu Daily & Original Blog (reproduced)
震惊,新的功能:可以按Ctrl + F 进行关键字查询. \(update\) on 10.26:把这两个月的日报也加入进去了,并且修复了几个错误. 本文会把小编用过的博客和比较好的博客放在这里. 可 ...
- 用了Redisson的Spring Boot Starter搞的我都想重写个
在对接一个小程序推送的框架时,需要将 access_token 存储到 Redis 中,框架中提供了存储逻辑,只需要将 RedissonClient 对象传进去即可. 框架内部在用 Redisson ...
- 使用Java将XSL和XML文件输出为HTML(XSL学习笔记二)
XSL 指扩展样式表语言(EXtensible Stylesheet Language),前面一篇博客介绍了使用XSL即可直接将XML输出为HTML片段被浏览器解析,但是这样在web应用中浏览器的解析 ...