直接清空 lay-verify 属性不能取消必填校验,必须配合 form.render() 更新缓存;更稳妥的是用 form.verify 动态注册条件规则,并同步移除 required 属性和 name 属性。

直接清空 lay-verify 属性就能取消必填校验,但只删属性不重载表单,旧规则仍会生效;更稳妥的做法是用 form.verify 动态覆盖规则,尤其适合条件性跳过(比如字段隐藏时)。
清空 lay-verify 后必须调用 form.render()
单纯执行 $('#field').removeAttr('lay-verify') 或 $('#field').attr('lay-verify', '') 只改了 DOM,Layui 内部缓存的验证配置没更新,提交时依然按老规则跑。关键动作是紧接着调用:
-
form.render():重载整个表单区域(推荐,简单可靠) -
form.render('input'):只重载 input 类型(适合只动了一个文本框)
注意:不能省略这一步,否则等于白操作。
用 form.verify 替代硬删属性更可控
当“是否必填”取决于运行时状态(如父容器 .intention 是否隐藏),硬删属性容易漏恢复、难维护。此时应注册自定义规则:
form.verify({
optional_required: function(value, item) {
if ($(item).closest('.intention').is(':hidden')) {
return ''; // 空字符串 = 通过校验
}
}
});
然后把目标元素的 lay-verify 改为 optional_required。这种方式不依赖 DOM 属性变更,逻辑集中,也不怕多次切换。
别忘了同步清理原生 required 属性
Layui 和浏览器原生校验会同时触发,导致重复弹窗或样式错乱。清空 lay-verify 的同时,务必也执行:
$('#field').removeAttr('required')- 如果该字段已废弃,建议顺手清空
name:$('#field').attr('name', ''),避免后端收到空值
这个细节常被忽略,但一旦出现「点提交就弹两个提示」,八成是它在作祟。
真正麻烦的不是删属性,而是删完之后状态没同步、原生校验还在后台偷偷干活——这两点卡住,90% 的“取消必填”都会失效。











