layui select 动态添加 option 后需调用 form.render('select') 才能重绘 UI;必须确保在 DOM 插入完成后执行,且 val() 值须与新 option 的 value 严格一致。
直接往 <select> 里用 append() 或 html() 加了 <option>,但下拉面板还是空的、点不开、或选不中——不是代码没执行,是 Layui 压根没重绘 UI。它不监听 DOM 变化,只认你手动告诉它“该刷新了”。
form.render('select') 是唯一有效触发重绘的方式,参数必须是字符串 "select",不能写成 "selects" 或漏掉lay-filter="myForm",推荐传第二个参数:form.render('select', 'myForm'),避免全局重绘影响其他 selectlayui.use(['form'], function() { ... }) 已加载,否则调用会报 form is not defined
form.render(),必须放在 success 回调里,等 DOM 插入完成后再执行即使 form.render('select') 成功执行,UI 仍卡在默认提示,大概率是新插入的 <option> 没带 selected 属性,或者 JS 里设的 val() 找不到匹配项。
selected 属性——Layui 渲染后会忽略它;正确做法是插入完再用 $('#mySelect').val('xxx') 设值,再 form.render('select')
val('xxx') 中的 xxx 确实存在于刚插入的 <option value="xxx"> 里,大小写、空格、引号都要严格一致<select> 里没有 <option value="">请选择</option>,Layui 默认会补一个,但此时你设 val('') 才能高亮它Layui 2.8+ 提供了内部映射表 form.select.options,绕过 DOM 操作,直接喂数据给渲染逻辑,适合后端返回对象数组的场景(比如 [{value: '1', title: '北京'}])。
<select lay-filter="city">,然后执行:form.select.options['city'] = newDataArray
form.render('select', 'your-form-filter'),它会自动读取这个 key 对应的新数组并重绘form.select.options,访问会得 undefined,必须降级用 DOM 方案title 含 &),也避免 value 和显示文本不一致的坑一级 select 改变时,二级要清空、填新选项、再设默认值——但很多人只清空 <option> 就结束,结果 UI 残留旧选项,或“请选择”不生效。
$('#city').empty()(别用 .html(''),某些版本会破坏结构)<option> 后,立刻 $('#city').val('')(确保默认提示被激活)form.render('select', 'filterName'),否则视觉不同步,用户看到的还是上次的选项form.on('select(province)') 里做兜底:if (!value) { $('#city').empty().val(''); form.render('select', 'xxx'); }
val() 就可能找不到目标值。Layui 不帮你等 DOM 就绪,它只信你传进去的那一刻。