layui radio 点击无法取消是因浏览器原生限制,需手动清空同 name 所有 radio 的 checked 并调用 form.render('radio') 同步 ui;仅设当前为 false 会失效,因 layui 强制维持同组至少一个选中。

直接点击已选中的 radio 不会取消,这是浏览器原生行为,Layui 没有、也不能绕过该限制。要实现“点击即取消”,必须手动清空同 name 下所有 radio 的 checked 状态,并调用 form.render('radio') 同步 UI。
为什么 form.on('radio') 回调里只设当前项为 false 会失效
Layui 内部对同 name 的 radio 强制维持“至少一个被选中”的逻辑。如果你只执行 $(data.elem).prop('checked', false),Layui 渲染时可能悄悄把同组其他项设回 checked,导致视觉和实际状态不一致。
- 必须先批量清除整组:
$('input[type="radio"][name="' + name + '"]').prop('checked', false) -
name要从data.elem上读取:var name = $(data.elem).attr('name') - 清除后必须立即调用
form.render('radio'),否则样式不更新
用原生 click 监听更稳定,尤其适合动态表单
当表单是 AJAX 加载、或存在 disabled 项、或多个 lay-filter 共存时,form.on('radio') 可能漏触发。推荐监听容器级 click:
- 绑定到
document或父级.layui-form容器上 - 用
e.target.closest('.layui-form-radio')定位点击区域 - 拿到内部
input[type="radio"]后,检查input.checked && !input.disabled - 清除同
name下所有非禁用项:document.querySelectorAll('input[name="' + name + '"]:not(:disabled)') - 调用
layui.form.render('radio', 'yourFilter'),第二个参数不能省,否则只刷新第一个匹配的form
Vue + Layui 混合场景下,DOM、UI、数据三者必须同步
如果 radio 绑定了 Vue 数据(如 v-model),光改 DOM 是不够的:
- 取消时除了
$(this).prop('checked', false),还得同步更新 Vue 实例字段:that.$set(that.formData, this.name, '') - 建议用
data-check属性记录用户意图,避免和初始值混淆(比如初始value="0"但未选中) -
form.render('radio')后,最好手动触发一次form.verify(),防止校验状态滞后
真正麻烦的不是写几行代码,而是每次都要同时维护 DOM 的 checked、Layui 的 UI 渲染状态、以及框架层的数据状态——少同步一步,就会出现“看着没选中,但 form.val() 还返回旧值”的情况。











