对el-date-picker日历面板日期的增加禁用状态

197 阅读1分钟

一、场景描述

场景需求是一个日历范围选择器,除当天外其他日期不可选,于是就:

pickerOptions: {
    return {
        disabledDate: (time) => {
            return new Date(time).getTime() >= Date.now() + 8.64e6 || time.getTime() < Date.now()
        }
    } 
}

二、问题反馈

晚上十点后,日历面板中当天无法选择,变成禁用状态了 ?_?

三、查找原因

经过各种日期打印,时间戳转换,发现居然是加了8.64e6导致的 (注:8.64e6 是科学计数法,即8640000,也就是1000 * 60 * 144 = 两小时24分钟),所以出现晚上十点后,发现当天无法选择,变成禁用状态了,准确的说是21:37分之后就出现了。被坑了一波,大晚上被叫定位查看问题-_-

四、总结

pickerOptions: function() {
    return {
        disabledDate: (time) => {
            // 8.64e7科学计数法,等同于 1000 * 60 * 60 *24,表示一天的毫秒数
            // 8.64e7 * days:days表示天数,当天为1,两天为2,依次类推,表示当天可用,前两天/后两天可用
            
            // 单个禁用
            // return time.getTime() < Date.now() - 8.64e7 * 1  // 当天可用,当天以前的日期不可用
            // return time.getTime() < Date.now()               // 当天不可用,当天以前的日期不可用
            // return time.getTime() > Date.now()               // 当天可用, 当天以后的日期不可用
            // return time.getTime() > Date.now() - 8.64e7 * 1  // 当天不可用,当天以后的日期不可用
            
           // 组合使用
           // return time.getTime() < Date.now() - 8.64e7 * 1 || time.getTime() > Date.now()  // 当天可用
           // return time.getTime() < Date.now() - 8.64e7 * 2 || time.getTime() > Date.now()  // 当天、昨天的能用
           // return time.getTime() < Date.now() - 8.64e7 * 2 || time.getTime() > Date.now()  // 当天、昨天、前天的能用
           
           // return time.getTime() < Date.now() || time.getTime() > Date.now() + 8.64e7 * 1  // 明天可用
           // return time.getTime() < Date.now() || time.getTime() > Date.now() + 8.64e7 * 2  // 明天、后天可用
           // return time.getTime() < Date.now() || time.getTime() > Date.now() + 8.64e7 * 3  // 明天、后天、大后天可用
           
       }
    }
}

总结:以Date.now()为当前节点进行比对,在此基础上减少/增加8.64e7*天数,即可实现日历面板的禁用状态

注意点:disabledDate需要的是一个最后的布尔值,在组合使用中,||取值,注意先后顺序问题

image.png

注:element-ui版本:^2.15.4