必须调用 ins.reload()(≥2.8.0)或重建实例才能生效,因 laydate 初始化后不监听 config 属性变化,直接赋值 config.min 仅修改内存值,日历面板无感知。
直接改 config.min 或 config.max 不生效,必须用 setoptions() 配合 reload()(laydate ≥ 2.8.0)或重建实例(老版本),否则联动永远卡死。
为什么改了 config.min 却没反应
laydate 初始化后不监听 config 对象的属性变更。执行 endIns.config.min = '2026-07-01' 只是改了内存里的值,日历面板完全无感知——它不会自动重绘。
- 最常见错误:在
done回调里只写endIns.config.min = ...,漏掉endIns.reload() - 老版本(reload(),只能先
endIns.destroy()再重新laydate.render(),但会丢失输入框焦点和已填值 - 别试图靠监听 input change 手动拼接日期再赋值——格式错一位、分隔符多一个空格,联动就断裂
min/max 传字符串还是 Date 对象?选错就出怪事
行为差异极大,尤其影响“今天下午选的时间是否可用”这类细节:
- 字符串如
"2026-07-01"→ 自动解析为当日 00:00:00,安全可控 - Date 对象如
new Date()→ 带当前时分秒,若用于max,可能把“今天 14:30 之后”全禁掉 - type 是
datetime且要精确到秒?字符串必须补零:"2026-07-01 14:30:00",否则解析易出错 - 对象字面量
{year: 2026, month: 6, date: 1}只在setOptions()里有效,render()初始化时不认
月份偏移(month - 1)是高频翻车点
done 回调返回的 date.month 是 1 起始(1=一月),但 setOptions 里 min.month 是 0 起始(0=一月)——直接赋值必错。
- 错误写法:
endIns.config.min.month = data.month→ 实际变成七月(因为data.month是 7,赋给 0 起始的 month 就成了八月) - 正确写法:
endIns.setOptions({ min: new Date(data.year, data.month - 1, data.date).toISOString().slice(0, 10) }) - 更稳方案:统一转成字符串,彻底绕过月份歧义,比如
`${data.year}-${String(data.month).padStart(2, '0')}-${String(data.date).padStart(2, '0')}`
range: true 和分开绑定两个 input 的底层逻辑完全不同
混用等于白配,面板不弹、控制台无报错、点击没反应是常态。
-
range: true:绑定单个<input>元素,laydate 自动渲染左右双月面板;分隔符可自定义,如range: '至',但不能带空格或全角符号 - 分开绑定:必须用父容器包裹两个
<input>,再传range: ['#start', '#end'];漏掉父容器或选择器写错,联动直接失效 - 初始值格式必须匹配
range设置,比如range: '至',但 value 是"2026-07-01 - 2026-07-31",前半段能识别,后半段会被忽略
真正难的不是写几行 setOptions,而是记住 month - 1、reload() 必须跟上、字符串比 Date 对象更稳——这些点漏一个,联动就静默失效。











