一、效果图

日期选择组件大概长这样:

从效果图可以看出,日期选择组件由两部分组成:日历表格和顶部操作栏。

二、日历表格

日期选择组件的核心主体是日历表格:

可以将日历表格表示成一个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)的实现的更多相关文章

  1. 支付宝小程序日期选择组件datePicker封装

    github 地址 https://github.com/iocool/antminDatePicker 最近在做支付宝小程序(以下简称小程序)开发,发现小程序的日期选择组件很不好用,比如安卓和IOS ...

  2. sencha:日期选择组件datepicker

    来源于<sencha touch权威指南> ------------------------------- 除app.js外,其它内容都与上一篇博客里的内容相同.app.js代码如下: E ...

  3. react-native DatePicker日期选择组件的实现

    本教程的实现效果如下: 为了实现其淡入/淡出的覆盖效果, 还有取消按钮, 在此用了一个三方的组件, 大家可以先安装一下: 三方组件的地址:https://github.com/eyaleizenber ...

  4. antd-mobile的DatePicker日期选择组件使用

    现在项目上有个需求,在时间选择上需要精确到分钟,且分钟只能是0分钟或者是30分钟. 使用了antd-mobile的DatePicker组件,具体用法可参考:https://mobile.ant.des ...

  5. Ant Design 日期选择组件RangePicker 选择时间范围后计算范围内的天数。

    /** *需求:同年同月,同年不同月(两个月相减大于1,小于1),不同年(两个年相减大于1(是否为闰年),小于1),起止包含的月份及天 */ //首先引入组件 import { DatePicker} ...

  6. My97DatePicker -- 一个功能丰富, 而且兼容 ie 6, 7的日期选择组件

    easyUI 也提供了 功能强大的日期组件, 可惜在ie 6,7,8下会报错,没有找到 addEventListener , JSON,  可能现在不想再支持低版本ie了 另外avalon也提供了 日 ...

  7. vue 移动端日期选择组件 vue-mobile-calendar

    vue-mobile-calendar cnpm install vue-mobile-calendar -S import Vue from 'vue' import Calendar from ' ...

  8. 页面日期选择控件--jquery ui datepicker 插件

    日期选择插件Datepicker是一个配置灵活的插件,我们可以自定义其展示方式,包括日期格式.语言.限制选择日期范围.添加相关按钮以及其它导航等.官方地址:http://docs.jquery.com ...

  9. element-ui日期组件DatePicker设置日期选择范围Picker Options

    element-UI提供了DatePicker日期选择器组件,可以让我们很方便的获取到日期,默认的选择是全部的日期都可以选择的,但是很多场景中我们要对日期选择范围做限定,比如出行日期就不能选过去的日期 ...

随机推荐

  1. PLC模拟量输入和数字量输入是什么

    数字信号输入输出: 就是开关闭合,断开. 模拟量输入输出: 就是一个数值.比如:液位1.5米,温度30度,这样的数. 输入单元 输入单元是PLC与被控设备相连的输入接口,是信号进入PLC的桥梁,它的作 ...

  2. MONGODB02 - MongoSocketWriteException 异常会迟到,但从不缺席

    接上一个<MONGODB01 - Prematurely reached end of stream 错误定位及修复>处理完成之后,又报错了,场景也是一段时间不访问MongoDB,突然访问 ...

  3. uniapp微信授权操作后事件不触发

    微信小程序官网代码 <button form-type="submit" open-type="getUserInfo" bindgetuserinfo= ...

  4. Ros中创建msg和srv遇到的问题

    在创建msg和srv文件之后,使用srv和msg文件时候需要对xml文件进行修改,如下: <build_depend>message_generation</build_depend ...

  5. 老师问学生while判断

    老师问学生,这道题你会做了吗?如果学生答"会了(y)",则可以放学.如果学生不会做(n),则老师再讲一遍,再问学生是否会做了...... (1)直到学生会为止,才可以放学. (2) ...

  6. Grafana+Prometheus+node_exporter监控,Grafana无法显示数据的问题

    环境搭建: 被测linux机器上部署了Grafana,Prometheus,node_exporter,并成功启动了它们. Grafana中已经创建了Prometheus数据源,并测试通过,并且导入了 ...

  7. php判断用户设备类型

    最近做的一个需求里面希望能判断用户访问页面的设备类型,根据不同的类型去加载不同的数据和页面样式.由于技术栈是使用的php,于是考虑在php层面去做这个判断. 假设主要判断的设备有平板和手机为主,分两个 ...

  8. Luogu Daily & Original Blog (reproduced)

    震惊,新的功能:可以按Ctrl + F 进行关键字查询. \(update\) on 10.26:把这两个月的日报也加入进去了,并且修复了几个错误. 本文会把小编用过的博客和比较好的博客放在这里. 可 ...

  9. 用了Redisson的Spring Boot Starter搞的我都想重写个

    在对接一个小程序推送的框架时,需要将 access_token 存储到 Redis 中,框架中提供了存储逻辑,只需要将 RedissonClient 对象传进去即可. 框架内部在用 Redisson ...

  10. 使用Java将XSL和XML文件输出为HTML(XSL学习笔记二)

    XSL 指扩展样式表语言(EXtensible Stylesheet Language),前面一篇博客介绍了使用XSL即可直接将XML输出为HTML片段被浏览器解析,但是这样在web应用中浏览器的解析 ...