重置按钮需设为type="button"以避免提交,清空Layui组件须用form.val()配合render(),date需额外设val并调用setValue,表格重载前须同步清空UI与where参数。

重置按钮点击后不触发表单提交或页面刷新
默认情况下,<button type="button"> 才能避免触发表单提交;如果用 <button> 且在 <form> 内,浏览器会按 type="submit" 处理,导致页面跳转或重载。Layui 表格搜索区域常嵌在 <form> 中,这点极易被忽略。
实操建议:
- 重置按钮必须显式写成
<button type="button" id="resetSearch">重置</button> - 不要依赖
form.reset()—— 它只清空原生表单控件(如<input type="text">),但对 Layui 渲染的select、date、checkbox等组件无效 - 绑定点击事件时,确保使用
layui.use(['form'], function(){...})加载 form 模块,否则form.val()和form.render()不可用
如何正确清空 Layui 的 select / date / checkbox 组件值
Layui 的表单组件(如下拉框、日期选择器)是通过 JS 动态渲染的 DOM,其真实值不直接存在 value 属性中,而是由 Layui 内部维护。直接设 elem.value = '' 或 $(elem).val('') 无法同步 UI 状态。
实操建议:
- 对
select:调用form.val('filterName', { 'field': '' }),再执行form.render('select', 'filterName') - 对
date:先清空输入框$('#dateField').val(''),再调用laydate.render({ elem: '#dateField', value: null })或用laydate.ins1 && laydate.ins1.setValue('')(需提前保存实例) - 对
checkbox:用form.val('filterName', { 'field': [] })清空数组值,再form.render('checkbox') - 所有字段统一处理可封装为:
form.val('filterName', {}),但注意这仅重置已注册的字段名,未声明的字段不会被覆盖
表格重载时搜索条件未清空的典型原因
很多人调用 table.reload() 时传了 where 参数,但没同步更新表单 UI,结果界面上还显示旧值,用户误以为“没清空”。本质是视图(UI)和数据(where)不同步。
实操建议:
- 清空操作必须分两步:先重置表单 UI(上一节方法),再调用
table.reload({ where: {} }) - 避免在
where中硬编码初始值,例如不要写where: { status: $('#status').val() || '' }—— 这会绕过表单重置逻辑,应统一从form.val('filterName')取值 - 如果用了
table.on('tool(filterName)', ...)自定义工具栏,注意其回调里的data是当前行数据,不是搜索条件,别混淆作用域
完整可复用的重置函数示例
把上述逻辑收口成一个函数,适配多数 Layui 表单结构:
<script>
layui.use(['form', 'table', 'laydate'], function(){
var form = layui.form,
table = layui.table,
laydate = layui.laydate;
// 假设搜索表单 filter 名为 'searchForm',表格 reload 的 id 为 'dataTable'
document.getElementById('resetSearch').onclick = function(){
// 1. 清空表单值(含 select/date/checkbox)
form.val('searchForm', {});
form.render(null, 'searchForm'); // 重绘全部类型
// 2. 特殊处理 date(若存在)
$('#startTime, #endTime').val('');
// 3. 重载表格,清空 where
table.reload('dataTable', {
where: {},
page: { curr: 1 } // 重置分页到第 1 页
});
};
});
</script>
注意:如果页面有多个搜索区域或动态增删字段,form.val('searchForm', {}) 可能漏掉未初始化的字段,此时需先遍历 form.verify() 注册的规则,或改用手动逐个赋值方式。


















