必须先向原始select插入option再调用form.render('select','filter'),否则新选项不显示;因layui隐藏原始select并生成独立dl面板,不监听dom变化,且form.val()需配合form-filter而非select的lay-filter使用。
必须先往原始 <select></select> 元素插入 <option></option>,再调用 form.render('select', 'filter'),否则新选项永远不显示。
为什么直接 append() 后没反应?
Layui 渲染 select 后会把原始 <select></select> 隐藏,自己生成一个 <dl class="layui-anim"></dl> 作为可视下拉面板。你往原始 select 里加的 <option></option> 不会自动同步过去——它根本不监听 DOM 变化。
- 常见错误:
$('#mySelect').append('<option value="1">苹果</option>')之后没调form.render() - 更隐蔽的错:调了
form.render('select')但没传第二个参数(filter值),导致重绘范围不对,目标 select 没被覆盖 - 还有人用
innerHTML = ...替换整个内容,某些版本下会破坏 layui 内部结构,建议用.empty().append(...)
正确写法:DOM 操作 + render 缺一不可
两步必须严格按顺序执行,且确保 form 模块已加载。
- 先操作原始 select:
$('#mySelect').append('<option value="2">香蕉</option>')(或循环拼接、document.createElement) - 再立即调用:
form.render('select', 'my-filter'),其中my-filter是该 select 的lay-filter属性值,不是 ID - 如果没设
lay-filter,就用form.render('select'),但会全局重绘所有 select,性能差,慎用 - 务必包在
layui.use(['form'], function(){})里,否则form是undefined
批量注入更稳:改 form.select.options
Layui 2.8+ 提供了内部映射表 form.select.options,绕过 DOM 直接设数据源,避免 HTML 转义、空格、value/text 不一致等问题。
- 适用场景:后端返回数组对象,如
[{value: '1', title: '苹果'}, {value: '2', title: '香蕉'}] - 写法:
form.select.options['my-filter'] = newOptionsArray(key 是lay-filter值) - 然后调
form.render('select', 'my-filter'),它会读这个数组重绘 - 注意:2.7 及更早版本没有这个对象,强行访问会
undefined,得降级用 DOM 方案
动态添加后想默认选中某项?别用原生 val()
$('#mySelect').val('2').trigger('change') 在 layui 下大概率失效——原始 select 已被 hide,jQuery 的 val() 无法设值,甚至报 Cannot set property 'value' of null。
- 必须用:
form.val('form-filter', {selectName: '2'}),其中form-filter是外层<form></form>的lay-filter,selectName是 select 的name属性值 - 如果 form 没设
lay-filter,这个调用会静默失败,界面无反应 - 选中逻辑和渲染是两件事:先
form.render()让选项可见,再form.val()设值,顺序不能反
最容易被忽略的是:form.val() 的第一个参数不是 select 的 lay-filter,而是它所在 <form></form> 的 lay-filter;而 form.render() 的第二个参数才是 select 自己的 lay-filter。这两个 filter 容易混,一错就全卡住。











