layui select 必须用 form.val() 设置值并立即调用 form.render('select') 同步ui,仅操作dom value 或 selected 属性无效;多选需传数组,动态插入option后须重新 val() + render。

form.val() + form.render('select') 是唯一可靠路径
只写 $("#mySelect").val("2") 不会改变界面上的高亮状态,因为 Layui 的 select 是渲染后的 UI 组件,DOM 的 value 和视觉状态是分离的。必须显式通知 Layui 同步一次。
-
form.val('filterName', { 'mySelect': '2' })或$("#mySelect").val("2")设置原始 value - 紧接着调用
form.render('select')—— 这才是让下拉框真正“动起来”的关键一步 - 如果 select 有
lay-filter="city",推荐传第二个参数:form.render('select', 'city'),避免重绘整个表单影响性能 - 确保代码在
layui.use(['form'], function(){})内执行,且 DOM 已就绪(比如放在$(document).ready()或 form 初始化之后)
动态插入 option 后默认选中第一项,不能靠 selected 属性
HTML 里写 <option value="1" selected>北京</option> 只对纯静态页面有效;Layui 渲染后,selected 属性会被忽略。异步加载完数据再插入,必须手动控制。
- 拼接 HTML 字符串时,给第一个
<option></option>加上selected(不是selected="selected") - 用
$('#mySelect').html(htmlStr)替换全部内容(或append()后确保插入完成) - 立刻执行
$("#mySelect").val(firstValue)(如"1"),再调form.render('select') - 别信
selectedIndex = 0或直接改原生 DOM 的selected属性——Layui 不认这个
value="0" 的选项默认不被识别,得手动打标再 render
后端返回 data.status === 0,执行 $('#status').val(0) 没反应?不是 JS 失效,是 Layui 渲染逻辑跳过了字符串 "0" 和空字符串的匹配。
- 正确做法:先用 jQuery 定位并设属性:
$('#status').find('option[value="0"]').prop('selected', true) - 再调
form.render('select')同步 UI - 注意 HTML 中写的是
value="0"(带引号的字符串),不是value=0(无引号会被解析为空) - 动态插入时,确保
<option value="0">未启用</option>真的进了 DOM,别漏掉
多选下拉框(multiple)要传数组,且必须用 form.val()
多选场景下,$("#multiSelect").val("a") 会静默失败;Layui 要求传数组,且只能通过 form.val() 设置,不能只操作原生 DOM。
- 设置值:使用
form.val('filterName', { 'multiSelect': ['a', 'b'] }) - 不要用
$("#multiSelect").val(['a', 'b'])—— 它可能触发原生行为但不通知 Layui - 若没配
lay-filter,可用form.val(null, { 'multiSelect': [...] })按 name 匹配 - 插入新
<option></option>后,仍需重新form.val()+form.render('select'),否则新增项不会被选中
form.render('select') 这一步。最容易被忽略的,是它必须紧接在 value 设置之后、且不能被包裹在异步回调的竞态里——比如 AJAX 的 success 里刚插入 DOM 就立刻 val(),而没确认插入是否完成。











