laydate 不支持直接配置多个离散日期,必须通过 disabledDate 回调手动过滤;需用时间戳 Set 预处理允许日期,判断 date.getTime() 是否在集合中,且初始化 value 必须合法,手动输入仍需前后端二次校验。
laydate 原生没有 availabledates 或 whitelist 这类参数,无法像某些现代日历库那样传入 ["2026-06-01", "2026-06-15", "2026-06-30"] 就生效。硬要靠 min/max 或 range 实现“只选这三天”,会失败——它们只管连续区间,不处理跳选。
这是唯一可靠方式:在 disabledDate 函数里判断当前遍历的日期是否在允许列表中,返回 true 表示禁用,false 才可点。注意以下要点:
disabledDate 从 laydate v2.9.8 开始正式支持,低版本无效Date 对象(不是字符串),需自己格式化比对Set:const allowed = new Set([ new Date("2026-06-01").getTime(), new Date("2026-06-15").getTime(), new Date("2026-06-30").getTime()]);laydate.render({ elem: "#datePicker", disabledDate: function(date) { return !allowed.has(date.getTime()); }});
别写 date.toISOString().slice(0,10) === "2026-06-01" —— 时区和格式易出错,getTime() 最稳。
这个回调在所有 type 下都触发,包括 type: "date"、"datetime",甚至 type: "month"(此时 date 是当月第一天)。但要注意:
range: true,disabledDate 仍逐日执行,逻辑不变ready 后再设置 disabledDate,否则初始化时可能没数据即使你写了 disabledDate,如果 value 初始设为 "2026-06-05"(不在白名单中),laydate 会静默忽略它,输入框留空。所以:
value 是否在允许列表里真正容易被忽略的是:disabledDate 只控制面板点击和键盘导航,用户仍可手动输入任意日期。业务强校验必须配合提交时的前端二次检查 + 后端兜底。