layui单选框不能二选一,因其本质是HTML原生radio,同name值下天然互斥;实现“启用/禁用”等二选一需确保name相同、添加lay-filter并调用form.render('radio')后监听form.on('radio(filterName)')。

layui 单选框为什么不能二选一
layui 的 radio 组件本质就是标准 HTML 单选框,靠的是同名 name 属性实现“单选”逻辑——它天生就只允许选一个,不存在“二选一”这种需求。所谓“二选一”,其实是你有两个互斥选项(比如“启用/禁用”“是/否”),想让用户必须选其一,且只能选一个。
怎么用 layui 渲染两个互斥的 radio
关键不是“实现二选一”,而是确保两个 input[type="radio"] 共享同一个 name 值,并用 lay-filter 统一监听。layui 不会帮你自动绑定 name,这一步必须手写。
- HTML 中两个
input的name必须完全一致,例如name="status" - 必须调用
form.render('radio')(或form.render())才能让 layui 样式生效 - 监听时用
form.on('radio(status)', ...),括号里填的是lay-filter的值,不是name
示例:
<div class="layui-form-item">
<label class="layui-form-label">状态</label>
<div class="layui-input-block">
<input type="radio" name="status" value="1" title="启用" checked>
<input type="radio" name="status" value="0" title="禁用">
</div>
</div>
JS 初始化:
form.render('radio'); // 必须执行
form.on('radio(status)', function(data){
console.log(data.value); // 输出 '1' 或 '0'
});
为什么改了 value 却没触发 form.on
常见原因是:没调用 form.render(),或者 lay-filter 没写、写错、和监听时的字符串不一致。layui 的 form.on 不监听原生事件,它只响应自己渲染后生成的自定义事件,前提是 DOM 已被 layui 处理过。
- 检查是否漏掉
form.render('radio')—— 尤其在动态插入 radio 后 - 确认
radio父容器有class="layui-form"(否则部分版本可能不生效) -
lay-filter要加在表单最外层容器上,不是加在每个 input 上
需要默认选中但又不想写 checked 怎么办
可以初始化时用 JS 设置:document.querySelector('input[name="status"][value="1"]').checked = true;,然后立刻调用 form.render('radio')。注意顺序:先设 checked,再 render,否则 layui 可能按原始 DOM 状态覆盖。
更稳妥的做法是直接在 HTML 里写 checked,避免 JS 执行时机问题。动态场景下,务必在 DOM 插入后、form.render() 前完成 checked 设置。
真正容易被忽略的,是 name 和 lay-filter 的分工:前者控制浏览器原生单选行为,后者决定 layui 事件监听入口——两者不同名、不同作用,但缺一不可。


















