Layui单选框原生name分组失效,因其渲染后替换为自定义DOM结构(.layui-form-radio),必须通过form.on监听+手动禁用同value项+调用form.render('radio')同步样式。

layui 单选框本身不提供原生联动机制,必须靠手动控制 disabled 状态 + form.render('radio') 重绘,否则点击无效、状态不同步、重复选中等问题会直接暴露。
为什么直接用 name 分组不管用
layui 的 radio 渲染后,DOM 结构被替换为自定义标签(layui-radio),原生的 name 分组逻辑失效。你看到的“三组单选框选了同一个值”不是 bug,是没禁用其他组对应选项导致的逻辑冲突。
- 仅靠 HTML 的
name="lie_1"/name="lie_2"无法跨组互斥 - 点击事件绑定在容器上(如
onclick="danXuanLianDong()")但没清空其他组已选值 - 没调用
form.render('radio'),UI 不更新,用户感知不到禁用或选中变化
正确的联动写法:禁用 + 重绘 + 清空
核心是每次选中一个 radio,就禁用其他组里相同 value 的所有 radio,并重绘整个 radio 区域。
- 用
$("input[value='0']").prop('disabled', true)禁用所有 value 为 0 的 radio(跨组) - 禁用后必须调用
form.render('radio'),否则禁用样式不生效 - 如果某组已被选中,切换时要先
.prop('checked', false)再禁用,避免残留选中态 - 不要只操作
disabled属性,还要确保form.render()在 layui 模块加载完成后执行
容易踩的坑:事件监听时机和 DOM 状态错位
常见现象是“点了没反应”或“禁用失效”,本质是事件绑定早于 layui 渲染完成,或操作了被替换掉的原始 input。
- 不能在页面加载时直接写
$("input[name=lie_1]").on('click', ...)—— 此时原始 input 已被 layui 替换,事件不触发 - 必须在
layui.use(['form'], function(){...})内部操作,且用form.on('radio(filterName)', callback)监听(需给 radio 加lay-filter) - 禁用操作要作用于渲染后的 DOM:
layui.$("input[value='1']"),而不是原生$("input[value='1']") - 重置按钮必须同时清空
checked、disabled,再调一次form.render('radio')
真正卡住人的从来不是怎么写联动逻辑,而是没意识到 layui 把 input 变成了不可见的代理节点,所有 DOM 操作都得走 layui.$,所有状态变更都得靠 form.render() 同步视图。


















