layui select 清空重载需先 empty() 再 append() 并调用 form.render('select', 'filter'),否则 ui 卡死;须收起面板、清除高亮、设 selected、更新标题栏文本,并配合 table.reload({where: {}}) 重置查询条件。

layui select 清空后重新加载数据必须先 empty() 再 append() + form.render()
直接 innerHTML 或 html() 替换内容,Layui 下拉框 UI 会卡死或点击无响应——因为 layui 不监听 DOM 变化,只认 form.render('select', 'filter') 这个显式调用。
- 先清空原
select:用$('#mySelect').empty(),不是.html('')(后者可能残留空格导致渲染异常) - 再插入新
option:确保至少一项带value=""的“全部”项,比如<option value="">全部</option> - 最后必须调用
layui.form.render('select', 'searchForm'),第二个参数是表单的lay-filter值,不是 ID 或 class - 如果页面有多个
select且共用同一个 filter,一次form.render('select', 'filter')就够;否则要分别 render
动态加载时下拉面板残留导致选项点不动
AJAX 加载期间用户可能已展开下拉面板,form.render() 不会自动关闭它,旧面板 DOM 残留会遮挡新选项,造成“能看见但点不了”的假死现象。
- 加载前收起所有展开面板:
$('.layui-form-select dl').removeClass('layui-anim-upbit') - 清除已有高亮:
$('.layui-form-select dd').removeClass('layui-this') - 追加
option后,若需默认选中某项,得手动设selected属性:$('#mySelect option[value="2"]').prop('selected', true) - 别依赖 JS 设置
val()后 UI 自动同步——Layui 的 select 显示文本和 DOMvalue是分离的,必须靠form.render()
清空后仍显示旧文字?是因为 layui 缓存了标题栏文本
即使你把 select 的 value 设为空、form.val() 也写了、form.render() 也执行了,下拉框箭头旁的文字可能还是旧值。这是 layui select 组件内部缓存了上次选中项的显示文本,没被重置。
- 解决办法:在
form.render('select', 'filter')后,手动更新标题栏文字:$('#mySelect').closest('.layui-form-select').find('.layui-select-title span').text('请选择') - 更稳妥的做法是,在清空时统一走
form.val('filter', { fieldName: '' }),再form.render('select', 'filter'),而不是直接操作 DOMval() - 如果用了
lay-search,还要额外清除搜索框输入:$('#mySelect').siblings('.layui-unselect').find('input').val('')
表格搜索区域的级联下拉重置后请求仍带旧值
很多人以为清空 UI 就等于清空查询条件,结果 table.reload() 发出去的 where 里还是上一次的 province/city 值——因为 layui 表格实例自己缓存了 where 对象,不传参就不会刷新。
-
table.reload('tableId', { where: {} })是唯一有效写法;where: null、where: undefined、甚至where: { province: '' }都不行 - 级联字段(如省市区)必须在
form.val()中一并设空:form.val('searchForm', { province: '', city: '', district: '' }) - 别漏掉
page: { curr: 1 },否则翻页状态不会重置,reload 后可能还停在第 3 页 - 如果下拉是通过 AJAX 动态加载的,重置时还得把后续级联项的
disabled状态恢复:$('#city, #district').attr('disabled', true)











