根本原因是laydate不监听dom的value变更,只认实例config.value;必须在done回调中更新config.value并调用reload()才能同步ui与内部状态。
laydate 选择时间后不填充到 input,根本原因不是“没生效”,而是你没触发它的内部状态同步——它压根不监听 dom 的 value 变更,只认自己实例里的 config.value。
done 回调里直接改 input.value 是无效的
很多人写成这样:
laydate.render({
elem: '#myDate',
done: function(value) {
document.getElementById('myDate').value = value; // ❌ 白忙活
}
});
这行代码确实改了 DOM,但 laydate 实例完全不知道。下次点开控件,它仍按旧值渲染,甚至可能覆盖你刚设的值。
-
done是纯通知回调,不是赋值入口 - 手动改
input.value不会触发 laydate 内部的日期解析、格式校验、UI 同步 - 尤其在
type: 'datetime'下,value 是带时间的字符串,DOM 值错一位(比如少前导零),laydate 会静默忽略或 fallback 到今天
必须用 config.value + reload() 才真正生效
要让控件 UI 和内部状态一致,得走它的“官方通道”:
var dateIns = laydate.render({
elem: '#myDate',
format: 'yyyy-MM-dd HH:mm:ss',
done: function(value, date, endDate) {
if (!value) return;
// ✅ 正确做法:更新实例 config.value 并 reload
dateIns.config.value = value;
dateIns.reload();
}
});
-
dateIns必须提前存住,不能在done里重新laydate.render() -
reload()是关键,不调它 UI 就不会刷新,哪怕config.value已改 - 如果用了
range: true,两个输入框要分别拿到各自的实例再各自reload()
动态生成的 input 绑定失败?先清旧属性
新增行、克隆 DOM、AJAX 插入后调 laydate.render() 没反应?大概率是残留的旧绑定干扰:
-
lay-key和layui-laydate-id这两个属性不能共存,新控件会复用旧 ID 导致事件错位 - 每次 render 前,对目标
input执行:$(elem).removeAttr('lay-key').removeAttr('layui-laydate-id') - 别漏掉
form.render()(如果该 input 在 layui 表单内)
Vue/React 环境下值不回填?绕过框架劫持
框架接管了 input 的绑定逻辑,laydate 的 DOM 操作会被覆盖。不要依赖 v-model 或 useState 自动响应:
- 在
done回调里,用原生 JS 赋值:elem.value = value(elem是传入的 DOM 节点) - 再显式触发框架的更新机制:Vue 用
nextTick+vm.$forceUpdate()或ref.value = value;React 用setState显式调用 - 绝对不要在
done里调form.val()—— 它只对 layui 表单有效,对 Vue/React 数据源无意义
最常被忽略的点:reload() 前没确认 config.value 格式是否与 format 完全一致,少个空格、缺个前导零,reload 就等于没调。











