form.on('switch(filter)')是唯一可靠监听方式,需确保lay-filter值完全一致、动态设置value、异步渲染后调用form.render('switch'),并手动同步table.cache数据。
form.on('switch(filter)') 是唯一可靠监听方式
layui 表格里的 switch 是渲染出来的伪元素,原生 click 或 change 事件根本监听不到真实切换动作。必须用 layui 表单模块的代理事件:form.on('switch(filtername)')。
-
filterName必须和templet中input的lay-filter值完全一致(大小写、符号都不能错) - 不能用
name属性替代lay-filter,name只用于表单提交时字段名,不参与事件绑定 - 如果表格用了分页或重载,
form.on绑定只生效一次,后续新行的 switch 不会响应——这是最常漏掉的点
表格列 templet 中必须带 lay-filter 和 value
templet 返回的 HTML 必须包含两个关键属性:明确的 lay-filter 和可预测的 value。
-
value要根据原始数据动态写死,比如value="{{d.status ? 'on' : 'off'}}",否则切换后data.value永远是默认的"on" - 不要写成
name="status"就完事,所有行共用一个name会导致监听器拿到的data总是最后一行的数据 - 推荐写法:
<input type="checkbox" name="status_{{d.id}}" lay-skin="switch" lay-filter="statusSwitch" value="{{d.status ? 'on' : 'off'}}" {{d.status ? 'checked' : ''}}>
异步渲染表格后必须手动调 form.render('switch')
表格初始化时如果用了 url 异步加载数据,form.render('switch') 不能只在页面加载时调一次。
动态切换AI模型以优化成本与性能。当用户发出“eco mode”、“balanced mode”、“smart mode”或“max mode”等模式指令,或使用“/modes status”查询状态及“/modes setup”配置模式时触发。
- 必须在
table.render的done回调里再执行一次:layui.form.render('switch'); - 分页、搜索、重载后的新行,DOM 是后来插入的,没被
form模块接管,开关点击无反应就是这个原因 - 不要用
form.render()全量重绘,指定'switch'更精准、性能更好
状态变了但 table.cache 没更新?手动同步是硬要求
Layui 表格不感知自定义控件的状态变更。switch 切了,UI 变了,但 table.cache['yourTableId'] 里对应行的字段值还是旧的。
- 在
form.on('switch()')回调里,必须手动更新缓存:table.cache['test'].find(r => r.id == targetId).status = data.elem.checked; - 避免用
tr.dataset.index查找,翻页后索引会变,id字段才是稳定标识 - 同步后记得发请求更新后端,否则只是前端“看起来”变了,刷新就回退
表格里 switch 看似简单,但状态同步链路有三处断点:DOM 渲染、事件绑定、数据缓存。少一步,状态就脱节。

















