最可靠方式是直接设置原生select的value属性并调用form.render('select'),需在layui.use回调中DOM渲染完成后操作,动态添加option后必须重新render,form.val()需匹配lay-filter且name一致。
直接用 select 的 value 属性设置默认值最可靠
修改 layui select 默认选中项,本质不是调 layui 方法,而是操作原生 <select></select> 元素的 value 属性。layui 渲染时会读取这个值来高亮对应 <option></option>。如果先渲染再改,容易失效。
常见错误现象:调了 form.val('filter', {name: 'xxx'}) 或手动设 select.value = 'xxx' 但下拉没变——大概率是没在 layui.use(['form'], ...) 回调里操作,或 DOM 还没渲染完就改了。
- 必须等
form.render()完成后再设值,否则 Layui 不感知 - 推荐在
layui.use的回调里,form.render()之后立即设select的value - 如果数据异步加载,得在数据拿到、
<option></option>插入完毕、再form.render()后设值
示例:
layui.use(['form'], function(){
var form = layui.form;
// 假设 select 的 name 是 'city'
var sel = document.querySelector('select[name="city"]');
sel.value = 'shanghai'; // 直接设原生 value
form.render('select'); // 重绘下拉,触发选中态更新
});
form.val() 只对已渲染的表单有效,且需指定 filter
form.val() 是 Layui 提供的「表单赋值」方法,但它不直接操作 DOM,而是通过 filter(即 lay-filter 值)找到对应表单容器,再遍历子元素匹配 name。如果没写 lay-filter,或者 name 写错,它就找不到目标。
- 确保
<select lay-filter="demo"></select>和form.val('demo', {...})中的 filter 一致 -
form.val()第二个参数是对象,key 必须和<select name="xxx"></select>的name完全相同 - 它不会触发
change事件,如需联动,得手动trigger('change') - 对动态插入的
select,必须先form.render('select'),再form.val()
示例:
<select name="status" lay-filter="searchForm"><option value="">全部</option>
<option value="1">启用</option>
<option value="0">禁用</option></select>
// JS 中
form.val('searchForm', {
'status': '1' // 注意 key 是 name 值,不是 id 或 lay-filter
});
动态生成 option 后,必须重新 form.render('select')
Layui 不监听 DOM 变化,<option></option> 是 JS 拼接或 innerHTML 插入的,Layui 完全不知道新选项存在。此时即使设置了 select.value,渲染出的下拉菜单里也找不到对应项,显示为空白或首项。
- 所有动态增删
<option></option>的操作,都必须紧跟form.render('select') - 不要只用
form.render()(全量重绘),明确传'select'更快、更安全 - 如果同时有多个 select,且只改其中一个,建议给它加唯一
lay-filter,然后form.render('select', 'yourFilter')
典型踩坑场景:Ajax 加载城市列表后插入 option,但忘记 form.render('select'),导致默认值设了也看不见。
移动端或 disabled 状态下,select 渲染行为有差异
Layui 的 select 在 iOS Safari 或某些 Android WebView 下,对 disabled + 默认值组合处理不稳定;另外,如果 select 初始带 disabled 属性,form.render() 后可能无法正确高亮默认项。
- 避免初始
<select disabled></select>,如需禁用,用 JS 渲染后再sel.disabled = true - 移动端测试时,优先验证
select.value = xxx+form.render('select')组合是否生效,而非依赖form.val() - 如果页面有多个同名
name的select(比如表格每行一个),form.val()会批量赋值,容易误改——此时必须用原生 DOM 定位到具体元素
真正麻烦的点往往不在“怎么设”,而在于“什么时候设”:DOM 是否就绪、Layui 是否完成渲染、option 是否已存在、是否被禁用或在特殊环境里——这些状态一叠加,光靠一个 API 调用根本压不住。











