概述

今天使用 element 库的 date-picker 组件,使用日期范围,然后使用了 disabledDate 属性,把 2018 年 1 月和 2020 年 12 月之后的日期全部 disable 掉的时候,出现了一个小坑,就是点击2018 年 1 月和 2020 年 12 月的时候,点击会变得不顺畅,而且有时候会发生点击无效的情况,点击其它日期是正常的。我试了多种方法,终于把它解决了,记录下来,供以后开发时参考。

有坑的代码

下面是我原先点击不顺畅的代码:

<template>
<div class="block">
<el-date-picker
v-model="value"
type="monthrange"
align="right"
range-separator="至"
start-placeholder="开始月份"
end-placeholder="结束月份"
:picker-options="pickerOptions">
</el-date-picker>
</div>
</template>
<script>
export default {
data() {
return {
pickerOptions: {
disabledDate: (time) => {
return time.getTime() < new Date('2018-01').getTime()
|| time.getTime() > new Date('2020-12').getTime();
},
},
value: '',
};
},
};
</script>

分析原因,可能是 getTime 的锅,我把 time.getTime() 打印出来,发现组件上的 2018 年 1 月的getTime() 值略微大于 new Date('2018-01').getTime()。所以我想可能问题在于getTime,于是我换了一种实现:

<template>
<div class="block">
<el-date-picker
v-model="value"
type="monthrange"
align="right"
range-separator="至"
start-placeholder="开始月份"
end-placeholder="结束月份"
:picker-options="pickerOptions">
</el-date-picker>
</div>
</template>
<script>
export default {
data() {
return {
pickerOptions: {
disabledDate: (time) => {
this.isEarlyThan(time, new Date('2018-01'))
|| this.isEarlyThan(new Date('2020-12'), time);
},
},
value: '',
};
},
methods: {
isEarlyThan(dateA, dateB) {
// dateA 比 dateB 早则为 true(严格小于)
const yearA = dateA.getFullYear();
const yearB = dateB.getFullYear(); if (yearA < yearB) {
return true;
} if (yearA === yearB) {
return dateA.getMonth() < dateB.getMonth();
} return false;
},
},
};
</script>

结果问题成功解决!!!

另外

另外我发现,如果不指明小时的话,getHours() 会返回 8。示例如下:

new Date('2018-03-01').getHours() // 8
new Date('2018-03').getHours() // 8 new Date(2018, 1, 1, 0, 0, 0).getHours() // 0

所以以后在使用 getHours() 方法的时候需要格外小心,element 库的坑的原因或许也是因为这个。

性能

点击不通畅的问题也可能是性能原因,所以我们比较一下使用 getTime 和使用 isEarlyThan 方法的性能快慢,通过分析代码,可以知道其实主要是比较 getTime 和 getFullYear + getMonth 的性能大小。代码如下:

const date1 = new Date('2018-01');
const date2 = new Date(); console.time('getTime');
date1.getTime() > date2.getTime();
console.timeEnd('getTime'); console.time('getFullYear + getMonth');
date1.getFullYear() > date2.getFullYear();
date1.getMonth() > date2.getMonth();
console.timeEnd('getFullYear + getMonth');

结果 getTime 的性能比 getFullYear + getMonth 的性能要高一些。所以看来使用 getTime 的卡顿现象是组件自身的原因了。

element 库 date-picker 的 disabledDate 的坑的更多相关文章

  1. javascript date picker

    一个简洁的date picker <html><head><meta http-equiv="Content-Type" content=" ...

  2. iOS开发UI篇—Date Picker和UITool Bar控件简单介绍

    iOS开发UI篇—Date Picker和UITool Bar控件简单介绍 一.Date Picker控件 1.简单介绍: Date Picker显示时间的控件 有默认宽高,不用设置数据源和代理 如何 ...

  3. asp.net使用My97 Date Picker时设置默认起始时间为n年之前的今天

    可以使用My97 Date Picker组件来收集用户输入的日期值. 首先下载该组件:http://www.my97.net/dp/index.asp放到自己的项目中. 然后在项目里面引用js和css ...

  4. Date Picker Calendar For Oracle Forms 6i

    Giving date picker calendar option to user for date type fields in Oracle Forms. I am providing you ...

  5. Freebie: Date Picker Calendar Demo Form For Oracle Forms 6i

    I have already posted and provided the required PLSQL Library and the Calendar FMX file in my previo ...

  6. 微软BI 之SSRS 系列 - 基于时间段参数的 MDX 查询以及时间日历 Date Picker 的时间类型参数化

    今天在天善问答里看到一个问题,如果我没有理解错的话,它应该是指比如在一个报表中选取一个时间段,然后求出这个时间段的某个 Measure 的 SUM 和.并且同时求出这两个时间点对应的上一年的时间点之间 ...

  7. 记录js new Date日期处理的一个坑

    记录js日期处理的一个坑   当前时区为北美东部时区时, new Date('2019-4-1') new Date('2019-04-01') 结果是相关一个月的. 如下图   new Date(' ...

  8. 【踩坑记录】记录一次使用Python logging库多进程打印日志的填坑过程

    背景: 项目使用Python自带的logging库来打印日志 项目部署在一台Centos7的机器上 项目采用gunicorn多进程部署 过程: 1.LOG日志代码封装: 采用logging库,并设置w ...

  9. Date Picker和UITool Bar的使用

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Verdana } span.s1 { } span.s2 { background-colo ...

随机推荐

  1. 新霸哥带你轻松玩转Oracle数据库

    接触过软件开发的朋友可能都会知道oracle,在开发的过程中,数据存储都可能会用到oracle的,因为oracle具有处理速度快,安全级别特别的高.但是有一个缺点就是比较的贵,只有一个大型的公司才有可 ...

  2. 关于3.1 jmu-Java-03面向对象基础-01-构造函数与toString (3 分)

    PTA显示Compiler did not create the expected binary 不知所措   package nn;  import java.util.Scanner;       ...

  3. 五种I/O模型

    文档地址:https://www.cse.huji.ac.il/course/2004/com1/Exercises/Ex4/I.O.models.pdf 五种I/O模型: 1.  blocking ...

  4. js - 基础 之 预编译总结

    js运行步骤 语法解析(检查有无语法错误) 预编译 解释运行(将 js 翻译成计算机识别的语言(0.1组成),翻译一行执行一行) 预编译 [全局]: 创建 GO( Grobal Object ) 对象 ...

  5. /etc/fstab 下的配置参数

    第一列:分区的label或者UUID 若要查看/dev/sdb1设备的label或者UUID[root@localhost ~]# dumpe2fs -h /dev/sdb1dumpe2fs 1.42 ...

  6. 【python基础】元组方法汇总

    一.定义 用于存储一组数据的有序序列, 一旦创建, 元组中的各个元素不允许修改 二.特点 1.元组有序; 2.元组是不可变的数据类型;不可修改; 3.元组中可以存储重复的数据; 4.元组中可以同时存储 ...

  7. [SpringBoot] 通过spring.factory文件来加载第三方的bean

        在springboot的开发过程中,我们经常需要加载一些bean,如果bean使我们自己写的类,那很好办,加个@Component注解就搞定了,然后过程启动会扫描启动类所在的包及其子包,如果我 ...

  8. c++string int转化简单写法

    #include<iostream> #include<string> #include<sstream> //定义了stringstream类 using nam ...

  9. layui静态表格固定td宽度,table固定td宽度

    正在做一个项目,要求数据表的列是不固定的,有可能是有10列,有可能是20列,第一列宽度要固定,然后我怎么设置都没有用, 这个问题困扰了我三天,后来终于百度到了, 这个博客: https://www.c ...

  10. 使用vscode打断点

    1.vscode打开的文件必须只包含你要调适的项目,不能同时在一个vscode打开多个项目窗口 2.点击vscode的这个小蜘蛛 3.选择添加配置 4.此时自动生成了一个文件,launch.json: ...