如果你想一次性重置表单中所有已注册的 select 下拉字段,可以直接使用 form.val('searchFilter', {});但仅执行这一步还不够,随后必须立即补上 form.render('select', 'searchFilter'),这样才能把界面显示状态同步回来。若遇到级联下拉框,后续关联字段还需要手动清空并设置为禁用;如果是带搜索功能的下拉选择框,也别忘了额外清除选中高亮状态。

用 form.val() 一次性清空所有 select 下拉字段的值
直接遍历 DOM 后设置 select.value = '' 或使用 $(select).val('') 往往不会生效——因为 Layui 的下拉框本质上是伪元素实现,真实表单值与界面 UI 展示是分离的。要想正确批量清空 select,必须通过 form.val() 接口写入空值,它才会同步内部数据状态和渲染逻辑。
核心要点:传入空对象 {},即可批量清空当前表单中所有已注册字段:
form.val('searchFilter', {})—— 第一个参数必须与你的form标签中设置的lay-filter="searchFilter"完全一致,不能写错,也不能漏掉引号- 如果表单没有配置
lay-filter,也可以使用form.val(null, {})(Layui 2.8+ 支持),但并不推荐,因为容易误清空其他区域的表单字段 - 该操作只会影响存在
name属性、且已经经过form.render()渲染的select下拉框,没有name的字段会被自动忽略
必须紧接着调用 form.render('select', 'searchFilter')
form.val() 只会修改数据值,本身不会自动刷新 UI。你如果发现下拉框标题区域仍然显示旧文本,或者选项高亮状态没有消失,通常就是因为没有及时重新渲染。
常见错误写法:
- 只写
form.render()—— 这会重绘整个页面中的所有 form 模块,不仅性能较差,还有可能影响其他表单区域 - 写成
form.render('select')(漏掉 filter)—— 无法准确匹配目标表单,结果就是看起来什么都没有刷新 - filter 名称与
lay-filter的值不一致(例如多了空格、大小写不同)—— 会导致渲染失败,界面状态无法正确同步
正确写法应为:layui.form.render('select', 'searchFilter'),其中第二个参数必须严格等于 lay-filter 的实际值。
级联下拉要额外处理后续字段和禁用状态
例如“省份→城市→区县”这类三级联动下拉框,在清空省份后,城市和区县字段不能仅靠 form.val() 简单置空——因为它们对应的 options 可能依旧保留旧数据,甚至仍然处于可选状态。
实用处理建议:
- 在
form.val('searchFilter', { province: '', city: '', district: '' })中显式清空所有级联字段 - 对城市、区县对应的
select元素,手动添加disabled属性:$('#city').attr('disabled', true) - 清空其
innerHTML或移除所有option(保留默认项):$('#city').empty().append('') - 最后再统一执行
form.render('select', 'searchFilter'),否则 disabled 状态不会同步到 Layui 的渲染层
带 lay-search 的 select 清空后自动回填?手动破除缓存
启用搜索功能的下拉框还有一个隐藏特性:当输入框被清空时,Layui 可能会自动恢复上一次选中的 option。这并不是 bug,而是它内部搜索态的还原机制在起作用。
要绕开这个问题,下面两个步骤缺一不可:
- 先执行
form.val('searchFilter', { field: '' }) - 再手动清除 UI 高亮:
$('select[name="field"]').siblings('.layui-form-select').find('.layui-this').removeClass('layui-this').addClass('layui-hide')
注意执行顺序不能反,否则高亮状态仍可能残留;同时也不要漏掉 form.render('select', 'searchFilter'),否则下拉面板中的选项依然会显示为选中状态。
真正更麻烦的是动态加载的级联选项——这类场景下,对应的 DOM 结构可能尚未生成,.layui-form-select 选择器也就无法正确获取目标元素。因此,清空下拉框的逻辑应放到数据加载完成后的回调中执行,而不是在按钮点击的瞬间立刻处理。
