应通过 form.on('switch(filterName)') 事件获取开关状态,配合 templet 中设置 value 和 lay-filter,并在表格异步渲染后调用 form.render('switch'),同时手动更新 table.cache 中对应行数据以确保状态同步。
layui table 里 switch 的状态怎么读取
不能直接用 $('#id').prop('checked'),因为 layui 的 switch 是渲染后的自定义 dom,原生属性不实时同步。
正确方式是监听 switch 的 change 事件,或从表格行数据中取值 —— 前者响应实时操作,后者依赖你初始化时是否把状态存进了 data。
- 如果开关是表格列配置的
templet: '<input type="checkbox" name="switch" lay-skin="switch">',它本身没绑定数据源,点击后 DOM 变了,但 JS 里没地方“查” - 推荐在列定义里用
templet返回带data-id和初始值的input,再配合lay-filter绑定事件 - 初始化表格时,确保每行数据里有对应字段(比如
status: true),后续修改才好回写、校验
用 form.on('switch(filterName)') 拿到最新值
这是最稳的实时获取方式。Layui 表单模块会自动代理所有带 lay-skin="switch" 且有 lay-filter 的元素。
关键点:filter 必须和 templet 中的 lay-filter 值一致,且要先 form.render('switch')(如果表格是异步渲染的,这步常被漏掉)。
form.on('switch(statusSwitch)', function(data){ console.log(data.elem.checked, data.value); });-
data.elem是真实<input>元素,data.value是其value属性值(默认on/off,可自定义) - 别忘了在
templet里写死value,比如value="{{d.status ? 'on' : 'off'}}",否则切换后data.value总是on - 如果表格用了
page: true,翻页后新行的 switch 不会自动绑定事件,得在done回调里重新form.render('switch')
表格行内修改后,怎么把开关状态同步回表格数据
Layui 表格本身不管理自定义控件的状态,你改了开关,table.cache 里的那行数据不会自动更新 —— 这是最多人踩坑的地方。
必须手动更新缓存,否则分页、排序、导出时还是旧值。
- 在
form.on('switch(...)')回调里,用table.cache['yourTableId'][data.elem.closest('tr').dataset.index].status = data.elem.checked; - 更稳妥的是用
table.getCheckData()或table.getData()配合查找,避免硬编码索引 - 如果用了
id字段(比如d.id),优先按 id 查找并更新:var row = table.cache['test'].find(r => r.id == targetId); if(row) row.status = data.elem.checked; - 注意:直接改
table.cache不触发视图刷新,但后续调用table.reloadData()或导出时能读到新值
为什么 $(...).val() 或 .attr('checked') 总是 undefined
因为 Layui 的 switch 渲染后,原始 input 被隐藏了,外层是模拟的 div + span;你选中的其实是伪元素,原生属性根本不更新。
强行用 jQuery 读取只会拿到初始值,或者根本读不到 —— 不是 bug,是设计如此。
-
$('input[name="status"]').is(':checked')→ 失败:input 被display:none,jQuery 认为不可交互 -
$('input[name="status"]').prop('checked')→ 失败:这个属性只反映初始化状态,不随 Layui 切换而变 - 唯一可靠路径:走 Layui 的事件机制(
form.on)或 DOM 上挂的data属性(比如你在templet里写了data-status="{{d.status}}") - 调试时直接看
data.elem.checked最准,别绕路
form.render('switch') 和手动同步 table.cache,这两步一缺,开关看着动了,其实啥也没留下。










