form.val('filter', {}) 是清空表单的唯一可靠方式,它同步更新 layui 数据模型与 ui;而 form.reset() 仅触发原生重置,无法同步 select、switch 等组件状态。

form.val('filter', {}) 是清空表单的唯一可靠方式
直接调用 form.reset() 不会清空 Layui 封装的组件(如 select、checkbox、switch、date),它只触发原生重置逻辑,UI 和内部状态完全不同步。你看到下拉框没变、开关还开着、日期框残留旧值——就是这个原因。
正确做法是用 form.val() 批量写入空值,它直接操作 Layui 的数据模型并同步更新 DOM 和 UI:
- 确保表单有
lay-filter="searchForm"(或其他合法 filter 值) - 执行
form.val('searchForm', {})—— 这会把所有已注册字段设为空(''、false、[]等按控件类型自动适配) - 若没有
lay-filter,Layui 2.8+ 支持form.val(null, {})清空当前页所有已渲染表单 - 注意:该调用不会自动触发表单验证重校验,红边和提示语仍存在
清空后必须手动重置验证状态和 UI 渲染
form.val() 只改值,不改校验痕迹。输入框边框还是红色、错误提示没消失、提交按钮可能仍 disabled——这不是 bug,是设计使然。
要真正“重置验证”,需额外两步:
- 移除验证失败样式:
$('#searchForm .layui-form-danger').removeClass('layui-form-danger') - 清除错误提示元素:
$('#searchForm .layui-form-error').remove() - 对
checkbox/radio/select等控件,必须调用form.render('checkbox')、form.render('select')等,否则 UI 不刷新 - 如果用了
laydate,还需单独清空其绑定的 input 并调用laydate.ins1 && laydate.ins1.setValue('')(前提是保存了实例)
带清除图标的 input 要额外触发 change/input 事件
如果你在 input 右侧加了 layui-icon-clear 图标,并通过 input.value = '' 清空,form.val('searchForm') 仍会返回旧值——因为 Layui 表单缓存依赖 change 或 input 事件。
点击清除图标时,必须显式触发事件:
-
inputEl.val('').trigger('change')(jQuery 写法) - 或原生写法:
inputEl.value = '';+inputEl.dispatchEvent(new Event('change')) - 仅设
value属性但不触发事件,等于没清空;后续form.val()读取的仍是缓存值 - 如果该 input 启用了
lay-verify,建议再调一次form.validate('searchForm')主动校验一次,确保状态归零
表格搜索区清空要同步 UI 和 where 参数
表格上方的搜索表单常被误认为属于 table 模块,其实它是独立 DOM。调用 table.reload('userTable', { where: {} }) 只改请求参数,界面输入框文字还在。
完整清空流程必须分三步走:
- 先用
form.val('searchFilter', {})清值 +form.render()刷新 UI - 再手动处理非 Layui 控件(如原生
input[type="date"]):document.querySelectorAll('.search-form input').forEach(el => el.value = '') - 最后才调
table.reload('userTable', { where: {} }),且 where 必须为空对象,不能留status: ''这类默认值 - 重置按钮务必设为
type="button",否则在<form></form>内会触发提交跳转
form.val() 都不完整,必须两者都做。











