Layui表格中switch必须用form.on('switch(filter)')监听,filter名须与lay-filter值完全一致;templet中value需动态生成字符串且匹配后端约定;异步加载后须在table.done中调用form.render('switch');状态变更后需手动更新table.cache并同步后端。
form.on('switch(filter)') 是唯一能捕获切换动作的监听方式
layui 表格里的 switch 是伪 dom,原生 click 或 change 事件根本收不到真实切换信号。必须用表单模块的代理事件:form.on('switch(filtername)'),且 filtername 必须和模板中 input 的 lay-filter 值**完全一致**(大小写、下划线、连字符都不能错)。
常见错误:
- 把
name="status"当成事件绑定依据——name只影响表单提交字段名,不参与事件匹配 - 多个 switch 共用同一个
name,导致回调里obj.elem指向最后一行的 DOM,拿到的id或数据全是错的 - 在表格初始化前就调了
form.on(),但没注意后续分页/重载插入的新行不会自动绑定
templet 中必须动态写死 value 并带 lay-filter
模板返回的 HTML 要同时满足两个硬性条件:有明确 lay-filter,且 value 根据原始数据动态生成。不能写成静态 value="on",否则所有行切换后都变成 "on",无法区分状态。
推荐写法:
<input type="checkbox" lay-skin="switch" lay-filter="statusSwitch" value="{{d.status ? 'on' : 'off'}}" {{d.status ? 'checked' : ''}}>
关键点:
-
value必须是字符串,且和你后端约定一致(比如 "on"/"off"、"1"/"0"、"true"/"false") - 不要依赖
d.status的布尔值直接塞进value,JS 里true + ''是"true",但 Layui 内部对value做的是字符串比对 - 如果用了
lay-skin="switch",checked属性只控制初始态,切换后的状态由value和当前勾选决定,不是靠它维持
异步渲染后必须手动调 form.render('switch')
表格用 url 异步加载数据时,form.render('switch') 不能只在页面加载时调一次。新插入的行(分页、搜索、重载后)DOM 是后来加的,没被 form 模块接管,开关点击毫无反应。
智能模型自动切换 V5.0.2 - 多模态感知,自动识别图片/视频/音频/代码/文本任务,切换最优模型。支持图片理解(qwen3-vl-plus)、视频音频(qwen3.5-plus)、代码(glm-5)、Office文档(MiniMax-M2.5)、推理等场景。零感知切换,无需手动操作。
正确做法是在 table.render 的 done 回调里补一次:
done: function(res, curr, count){<br> layui.form.render('switch'); // 注意:只 render switch,别用空参全量重绘<br>}
性能影响:
-
form.render()全量执行会遍历所有表单控件,开销大;指定'switch'只处理开关,快且安全 - 如果表格列数多、行数大,漏掉这一步,用户翻页后所有开关都“失灵”,但控制台又没报错,极难排查
状态变了但 table.cache 没更新?必须手动同步
Layui 表格不感知自定义控件变更。switch 切了,UI 翻转了,但 table.cache['yourTableId'] 里对应行的字段值还是旧的。刷新页面或重载表格,状态就回退。
在 form.on('switch()') 回调里,必须手动更新缓存:
- 别用
tr.dataset.index查找行——翻页后索引会变,不可靠 - 用稳定字段定位,比如
id:var row = table.cache.yourTableId.find(function(item){ return item.id == obj.value; }); - 更新后记得发请求到后端,否则只是前端“看起来”变了
- 如果用了
table.reloadData()或table.reload(),要确保where参数包含最新状态,否则重载后又回到旧值
整个链路有三处断点:DOM 渲染 → 事件绑定 → 数据缓存。少走任何一步,开关就变成“假交互”。

















