laydate快捷选项必须手动实现,“昨天”“近7天”等不原生支持,需用trigger:'click'配合ready回调注入,禁用内置theme,通过laydate.getEndDate()处理跨月,并手动同步双输入框及关闭面板。

laydate 快捷选项必须用 theme + trigger 配合 ready 手动注入
laydate 原生不支持“昨天”“近7天”这类快捷按钮,theme: 'molv' 或 theme: 'default' 里只有「今天」一个默认快捷项。要加自定义快捷入口,得放弃依赖内置 theme,改用 trigger: 'click' 绑定外部按钮,并在 ready 回调里手动写入值。
常见错误是直接往 btns 数组里塞字符串,比如 btns: ['now', 'yesterday'] —— 这根本不会生效,btns 只认 'clear'、'now'、'confirm' 这三个固定值。
- 所有快捷逻辑必须自己算日期:用
laydate.getEndDate(month)处理月末跨月,别硬写getDate() - 1 -
ready是唯一安全时机:此时 DOM 已渲染完成,可操作面板外的按钮;done是选完才触发,不适合做“点就填”的行为 - 不要用
this.elem.val()直接赋值后不管:记得同步触发input事件,否则表单校验或 Vue/React 数据绑定可能失效
怎么让「昨天」按钮正确处理跨月(比如 10月1日点昨天 → 9月30日)
直接用 new Date().getDate() - 1 在每月第一天会得到 0,变成非法日期。laydate 提供了 laydate.getEndDate(month) 来获取指定月份最后一天,配合 myDate.getMonth() 和 myDate.getFullYear() 才能稳住边界。
示例代码片段(非完整 render):
function getYesterday() {
var myDate = new Date();
var year = myDate.getFullYear();
var month = myDate.getMonth();
var date = myDate.getDate();
<p>if (date === 1) {
// 上月最后一天
var lastMonth = month === 0 ? 11 : month - 1;
var lastYear = month === 0 ? year - 1 : year;
var endDay = laydate.getEndDate(lastMonth + 1); // 注意:getEndDate 接收的是 1~12 的月份数
return lastYear + '-' + (lastMonth + 1) + '-' + endDay;
}
return year + '-' + (month + 1) + '-' + (date - 1);
}</p>
-
laydate.getEndDate(12)返回 31,laydate.getEndDate(2)自动按平年/闰年返回 28 或 29 - 月份参数传 1~12,不是 0~11,所以
myDate.getMonth() + 1后再传 - 别用字符串拼接后直接塞进 input:确保格式和
format一致,比如format: 'yyyy-MM-dd'就不能输出'2026-10-1'(少补零)
「近7天」范围怎么同步更新两个输入框(开始/结束)
如果用了双输入框区间选择(range: true),快捷按钮只能控制一个 input,另一个得手动同步。更稳妥的做法是:禁用 range: true,用两个独立实例,再通过 done 动态设对方的 min/max。
例如点击「近7天」时,设起始为 today - 6,结束为 today:
var startInput = document.getElementById('start');
var endInput = document.getElementById('end');
<p>// 渲染起始日期
laydate.render({
elem: '#start',
format: 'yyyy-MM-dd',
done: function(value, date) {
// 更新结束日期的最小可选值
endInstance.config.min = {
year: date.year,
month: date.month - 1,
date: date.date
};
}
});</p><p>var endInstance = laydate.render({
elem: '#end',
format: 'yyyy-MM-dd',
done: function(value, date) {
// 更新起始日期的最大可选值
startInstance.config.max = {
year: date.year,
month: date.month - 1,
date: date.date
};
}
});</p>
-
config.min/config.max必须是对象结构,不能是字符串或时间戳 - 月份字段是 0~11,所以
date.month - 1才对得上 JS Date 对象习惯 - 「近7天」逻辑建议封装成函数,避免在多个
done里重复计算
为什么点了快捷按钮,面板不自动关闭
laydate 没有提供类似 hide() 的公开方法直接关面板,laydate.getInst(id) 要求你提前设 id 参数,且只对单实例有效。最通用的隐藏方式是删 DOM:
document.querySelector('.layui-laydate').remove();
但要注意:如果页面有多个 laydate 实例,这个会干掉所有面板。更精准的做法是加 class 标识:
- 初始化时加
calendarClass: 'laydate-start'(需自行 patch 或用自定义主题) - 或用
elem关联:比如elem: '#start',那隐藏时用document.querySelector('#start').nextElementSibling?.remove() - 千万别用
setTimeout(() => { ... }, 0)延迟 hide —— 异步时机不可控,用户可能已点其他地方
快捷按钮的本质是绕过选择流程的“快捷填值”,它不走正常交互路径,很多隐式行为(如自动关闭、校验触发)都不会发生,必须手动补全。











