根本原因是没阻止表单默认提交行为;必须在submit回调中return false或e.preventDefault(),否则页面重载导致“未清空”假象,同时layui非原生组件需手动重置值并调用form.render()同步UI。

提交后页面不刷新,但输入框没清空?
根本原因是没阻止表单默认提交行为。哪怕你写了 form.val("filter", {}),只要没 return false 或 e.preventDefault(),浏览器就会走原生 GET/POST 流程,跳转或刷新——你看到的“没清空”,其实是页面重载后回到了初始状态,不是清空失败。
正确写法必须在 submit 回调里显式终止:
form.on('submit(submitBtn)', function(data){ /* 你的 AJAX 提交 */ return false; });- 别用
form.on('submit()', ...)这种无参数写法,它无法捕获按钮 lay-filter,容易漏控 - 如果用了 jQuery 绑定
$('form').on('submit', ...),必须手动e.preventDefault(),且注意data.field不可用,得自己序列化表单
layui 的 select/date/switch 清空不了?
因为它们不是原生控件,form.reset() 和直接设 value="" 都只动了底层 DOM,没同步 layui 内部状态和 UI 层。常见现象:下拉框文字还显示旧选项、日期框里有值但 form.val() 读不到、开关仍处于 on 状态。
必须组合操作:
- select:先
form.val("filter", { "city": "" }),再form.render("select", "filter") - date/datetime:先
$("#dateField").val(""),再调用实例的laydateIns.setValue("")(需提前保存实例) - switch:必须设
false,设""或null无效:form.val("filter", { "isPublish": false }) - checkbox/radio:多选传空数组
[],单选传null,然后form.render("checkbox")
为什么 form.val("filter", {}) 之后 UI 没变?
form.val() 只改值,不重绘。Layui 的渲染是分离的,尤其在表单里混用原生 input 和 layui 组件时,漏掉 form.render() 就会卡在“值已清、UI 还在”的状态。
关键点:
- 批量清空后,必须紧跟
form.render()或按类型精确调用,如form.render("select", "filter") - 如果页面有多个 form 模块,用泛调
form.render()可能触发其他区域重绘,建议带 filter 参数限定范围 - 确保表单容器有
class="layui-form"且lay-filter="filter"属性,否则form.val()找不到目标 - input 上有默认
value="默认文本"?form.val()不会覆盖它,得先手动$("#field").val("")
表格搜索区域重置后,表格还是带旧条件?
这是最隐蔽的断层:清空表单 UI ≠ 清空表格请求参数。Layui 表格内部缓存了上次的 where 对象,table.reload("tableId") 不传参就复用旧缓存。
必须两步并行:
- 先清 UI:
form.val("searchFilter", {}); form.render(); - 再清请求:
table.reload("tableId", { where: {}, page: { curr: 1 } })—— 注意where: {}是空对象,不是null或undefined - 如果用了级联下拉(如省市区),所有字段都要在
form.val()中显式设为空,不能只清第一个 - 别碰
table.cache,它只影响前端渲染,不影响下一次请求发什么
真正麻烦的从来不是“怎么写一行清空代码”,而是组件状态、DOM 值、框架缓存、请求参数这四层之间不同步。每漏一层,就多一个“看起来清了,其实没清”的坑。


















