不能直接用 checkbox 实现单选,因为 Layui 的 checkbox 渲染逻辑天生支持多选,不提供组内互斥能力;手动 JS 控制会导致 form.val() 失效、校验异常、重置错误。

为什么不能直接用 checkbox 实现单选
Layui 的 checkbox 渲染逻辑天生支持多选,form.render('checkbox') 会把所有同名 input[type="checkbox"] 当作独立可勾选项处理,不提供组内互斥能力。强行用 JS 手动取消其他项的 checked 状态,会导致 form.val() 拿不到同步值、校验失效、重置异常——因为 Layui 内部状态和 DOM 状态脱节了。
正确做法:用 radio 替代 checkbox
radio 天然单选,Layui 对它的支持完整:能被 form.val() 正确采集、参与 required 校验、响应 form.reset()。只需视觉上模拟开关或对勾样式:
- HTML 结构保持两个同名
input[type="radio"],比如name="status",value="1"和value="0" - 用 CSS 隐藏原生 radio(
display: none),再通过伪元素或外层标签画出开关滑块 - 确保在调用
form.render()前完成 DOM 插入和样式初始化,否则 Layui 会覆盖你的自定义 UI - 监听原生
change事件即可,不用form.on('radio()')—— 后者只是语法糖,原生事件更稳且不影响表单同步
表格里 checkbox 强制单选的坑点
如果是在 table.render() 中,别改列类型为 type: 'radio' —— Layui 不识别,直接忽略。正确路径是:
- 保留
{type: 'checkbox'}列配置 - 在
table.on('checkbox(filter)')回调里,用table.checkStatus('filter').data获取当前已选项,再对非当前行调用table.uncheckRow() - 必须额外处理“点击已选项取消”的场景:Layui 默认不触发
checkbox事件,得在done回调里给每行 checkbox 绑定原生click,并用e.stopPropagation()防止冒泡干扰 - 依赖唯一字段(如
id)判断行,别用index—— 排序、分页后索引会变
动态插入 checkbox 后想限制单选怎么办
常见错误是 DOM 插入完才调 form.render('checkbox'),结果 Layui 把你写的 JS 逻辑覆盖掉了。关键动作顺序必须是:
- 先插入含同名
radio或带事件绑定的checkbox的 HTML 片段 - 立即执行样式初始化(比如加
class、设display: none) - 再调用
form.render('radio')或table.render(),如果是动态表格,记得传第二个参数指定容器 filter,比如form.render('radio', 'my-form') - 若用
checkbox+ JS 拦截,每次操作后必须跟form.render('checkbox'),否则 UI 和内部状态不同步
最易被忽略的是:表格中部分行禁用 checkbox 时,layChecked: true 字段只在初始化时生效,后续动态禁用必须靠 templet 控制 DOM 是否渲染该 checkbox,而不是靠 JS 隐藏或禁用 —— 否则全选逻辑会错乱。


















