layui自定义联动验证需注册规则,如密码一致性校验:在form.verify中定义repass规则,手动用layui.$取password值比对,返回错误信息或undefined;主字段变更时需手动清除关联字段的layui-form-danger类并触发blur校验。
lay-verify 怎么写自定义验证规则联动两个字段
不能直接用内置 lay-verify="required|email" 实现跨字段逻辑(比如“密码和确认密码必须一致”),必须注册自定义规则。Layui 的验证机制是单字段触发、独立执行,form.verify() 里每个规则函数只接收当前字段的值和 item DOM 元素,不自动传其他字段值——所以得手动取。
常见错误现象:form.verify() 函数里直接写 $("#pwd2").val() 却没等 DOM 加载完,或用了 jQuery 但页面没引入;又或者在规则函数里修改了其他字段的样式/值,导致验证状态错乱。
- 规则函数必须返回 字符串(报错信息) 或 undefined(通过),返回
true/false无效 - 取其他字段值推荐用
layui.$(避免和全局 jQuery 冲突),且确保该字段已渲染完成(如放在layui.use(['form'], ...)回调内) - 不要在验证规则里调用
form.val()或form.render(),可能触发重入或 UI 闪烁
“两次输入密码不一致”怎么写验证函数
这是最典型的联动场景:比较 password 和 repassword 字段。关键不是“怎么比”,而是“什么时候比”——必须等两个字段都输入后才校验第二个字段,且第一个字段变化时,第二个字段的校验状态要清空(否则用户改了原密码,确认框还显示“校验通过”就错了)。
使用场景:注册/修改密码表单;需配合 lay-verify="repass" 给确认密码字段绑定规则名。
layui.use(['form'], function(){
var form = layui.form;
form.verify({
repass: function(value, item){ // value 是 #repass 的值,item 是它的 DOM 元素
var pwd = layui.$('#password').val(); // 手动取密码框值
if(value !== pwd){
return '两次输入的密码不一致';
}
}
});
});
- 注意:这里没做空值判断,因为
repass规则只在用户输入后触发;若想“确认密码为空时不校验”,可加if(!value) return; - 性能影响极小,但频繁输入时会反复取值,无须防抖——Layui 自身对验证有节流
- 兼容性没问题,
layui.$在所有支持 Layui 的浏览器中行为一致
联动校验失败后怎么手动触发重新验证
当用户修改了主字段(如密码),确认密码字段的错误提示不会自动消失,因为 Layui 不监听其他字段变化。这时候需要手动清除验证状态并触发校验,否则体验断裂。
容易踩的坑:直接调用 form.validate() 会校验整表单,打断用户操作流;用 form.val('form-filter', {repassword: ''}) 改值又可能触发冗余验证。
- 推荐做法:监听主字段
input事件,在回调里对关联字段调用form.verify()并清理其layui-form-danger类 - 更稳妥的是用
layui.$(item).closest('.layui-form-item').removeClass('layui-form-danger')清除 UI 状态,再让目标字段失去焦点(.blur())触发校验 - 不要用
form.reset(),它会清空所有字段值
多个联动条件(比如“手机号+验证码”组合校验)要注意什么
这种不是简单相等,而是“手机号格式正确且验证码非空”,属于复合条件。Layui 不支持在一个 lay-verify 属性里写多个自定义规则(如 lay-verify="phone|code" 会分别执行,无法共享上下文)。
解决方案只有一个:把校验逻辑收拢到验证码字段的规则函数里,先取手机号值,再综合判断。
- 如果手机号本身有格式校验(如
lay-verify="phone"),它的规则仍独立运行,不影响此处逻辑 - 错误信息要具体,比如返回
'请先填写正确的手机号'而不是笼统的'验证失败' - 别在规则函数里发请求(如校验短信验证码是否有效),Layui 验证是同步的;异步校验要用
form.on('submit(...)')拦截后手动处理
layui.$ 取元素容易失效,得用事件委托或每次渲染后重绑验证规则。











