必须调用 form.render('select') 才能重绘 layui select,因其不监听 dom 变化;追加 option 后需立即 render,推荐指定 lay-filter;选中值须用 form.val() 而非 .val();layui 2.8+ 可用 form.select.options 批量注入数据。

必须调用 form.render('select') 才能重绘 UI
Layui 的 select 渲染后,原始 <select></select> 元素被隐藏,真实下拉面板是它自己生成的 <dl class="layui-anim"></dl>。往原生 select 里用 append() 或 html() 加了 <option></option>,Layui 完全不感知——它不监听 DOM 变化,只认你主动“喊它一声”。
所以追加完选项后,必须立刻执行:
-
form.render('select'):全局重绘所有select(简单场景可用) -
form.render('select', 'your-form-filter'):只重绘指定表单容器内的select(推荐,避免误刷其他下拉框)
注意:'select' 是固定字符串,不能写成 'selects'、'Select' 或省略;第二个参数是 form 元素的 lay-filter 值,不是 select 的 ID 或 name。
常见错误:DOM 插入了,但 render 没生效
现象:控制台没报错,form.render('select') 看似执行了,但下拉框还是空、点不开、或选不中新选项。
- 调用时机太早:比如在 AJAX
success外部就执行了,DOM 还没插入完成 -
form模块未加载:没包在layui.use(['form'], function() { ... })里,form是undefined -
lay-filter缺失或拼错:目标select没设lay-filter,或 render 时传的 filter 值和 HTML 中不一致 - 用了
innerHTML =而非append()或empty().append():某些版本下会破坏 Layui 内部结构
调试时直接看 DOM:select 元素上有没有 lay-id 属性?没有说明 form.render() 根本没跑过。
选中某项必须用 form.val(),别碰 .val()
动态加完 <option value="2">上海</option> 后,想默认选中它?千万别写 $('#mySelect').val('2').trigger('change')——原始 select 已被 hide,jQuery 的 val() 失效,甚至可能报 Cannot set property 'value' of null。
正确做法是:
- 确保新
option的value="2"和你要设的值严格一致(大小写、空格、引号) - 调用
form.val('your-form-filter', {name: '2'}),其中name是select的name属性值,不是 ID,也不是lay-filter - 这个
form.val()必须在form.render('select', ...)之后执行
如果初始 select 里没有 <option value="">请选择</option>,Layui 默认会补一个空选项,此时设 form.val(..., {name: ''}) 才能让它高亮。
Layui 2.8+ 推荐用 form.select.options 批量注入
当后端返回的是对象数组(如 [{value: '1', title: '北京'}, {value: '2', title: '上海'}]),直接拼 HTML 容易出转义、空格、value/text 不一致等问题。Layui 2.8+ 提供了更稳的方案:
- 先确认目标
select的lay-filter="city" - 执行
form.select.options['city'] = newDataArray(key 是lay-filter值) - 再调
form.render('select', 'your-form-filter')
这个方式绕过 DOM 操作,Layui 渲染时自动读取该 key 对应的数据并生成选项,天然规避 HTML 转义和同步问题。但注意:form.select.options 在 2.7 及更早版本中不存在,访问会得 undefined,必须降级用 DOM 方案。











