直接点击已选中的radio不会取消,因为浏览器原生规范强制同一name下仅一个radio可被选中,change事件不触发;Layui未改变该行为,需手动清空同name所有radio并render更新UI。
为什么直接点击已选中的radio不会取消
因为浏览器原生规范强制同一name下的<input type="radio">必须保持且仅有一个checked状态,点击已选项时change事件根本不会触发——layui只是封装了样式,没改底层行为。所以form.on('radio')监听不到这个动作,更不会自动取消。
用form.on('radio')手动干预状态
必须在回调里主动判断并重置,不能依赖事件“自然发生”:
- 用
$(data.elem).prop('checked')读取当前是否已选中 - 若为
true,则调用$(data.elem).prop('checked', false)强制取消 - 紧接着执行
form.render('radio'),否则UI不更新(Layui的DOM状态和视觉样式是分离的) - 注意:只操作当前项会导致同组其他radio被Layui内部逻辑悄悄“补回”选中,所以得先清空整组
示例代码:
form.on('radio(yourFilter)', function(data) {
var $elem = $(data.elem);
var name = $elem.attr('name');
// 先清空同name所有radio
$('input[type="radio"][name="' + name + '"]').prop('checked', false);
// 再渲染
form.render('radio');
});
用原生click事件捕获更可靠
当表单动态生成、或存在禁用项、或多lay-filter共存时,form.on('radio')可能漏触发。推荐绑定到.layui-form-radio容器上:
- 监听
document或父容器的click,用e.target.closest('.layui-form-radio')定位点击区域 - 拿到内部
input[type="radio"]后,检查input.checked && !input.disabled - 清除同
name下所有非disabled的radio:document.querySelectorAll('input[name="xxx"]:not(:disabled)') - 调用
layui.form.render('radio', 'yourFilter'),第二个参数必须填对,否则只刷新第一个匹配的form
Vue + Layui混合场景下要同步data
如果radio绑定Vue数据(如v-model或that.$set),光改DOM不够:
- 用
$(this).data('waschecked')或data-check属性记录用户点击意图,避免和初始值混淆 - 取消时不仅要
$(this).prop('checked', false),还得that.$set(that.formData, this.name, '') -
form.render('radio')之后,建议再触发一次form.verify()或手动校验,防止校验状态滞后
真正麻烦的不是写几行代码,而是每次都要同时维护DOM状态、Layui UI状态、框架数据状态三者一致——少一步,就会出现“看着没选中但form.val()还返回旧值”的情况。











