layui的lay-verify多规则须用空格分隔,如“required phone email”;v2.8+版本phone/email/identity规则支持空值自动放行,老版本需自定义处理;自定义规则名不可与内置冲突,且form.validate()需配合type="button"手动控制提交。

直接用内置规则就行,但必须注意版本差异和写法细节,否则看似配对了,实际校验逻辑根本没生效。
lay-verify 多规则怎么写:空格不是竖线
很多人复制示例时抄错成 lay-verify="required|phone|email",这会触发一个叫 required|phone|email 的自定义规则查找——而它并不存在,结果验证直接跳过。Layui 是用空格切分规则名的,不是竖线或逗号。
- ✅ 正确:
lay-verify="required phone email" - ❌ 错误:
lay-verify="required|phone|email"或lay-verify="required,phone,email" - 多个规则独立执行,顺序无关,但若需前置依赖(比如先判非空再校格式),得靠自定义函数内部控制
手机号验证失败的常见原因
phone 规则在 v2.8+ 版本中已支持空值通过(正则含 (^$)|),但它仍严格要求纯数字、11位、首字符为 1。任何空格、括号、横线、中文符号都会导致失败。
- 用户输入
138 1234 5678→ 不通过(含空格) - 用户输入
138-1234-5678或(138)1234-5678→ 不通过(含符号) - 解决办法:前端加
oninput实时清洗,如this.value = this.value.replace(/\D/g, '');或改用自定义规则预处理 - 别把
readonly或disabled元素配上lay-verify,它压根不校验
邮箱和身份证号要小心“非空即校”陷阱
低版本 Layui(v2.5.x 及更早)的 email 和 identity 规则没有空值兜底逻辑,哪怕字段非必填,只要写了 lay-verify="email",空字符串也会触发格式校验并报错。
- v2.8+ 已修复:正则开头加了
(^$)|,空值自动放行 - 如果你还在用老版本,要么升级,要么手动补空值判断:
lay-verify="email"改成自定义规则,例如myEmail,并在函数里先if (!value) return - 身份证号建议始终用自定义规则,因为内置
identity仅做基础位数和末位校验,不校验出生日期有效性或地区码 - 注册自定义规则时,名字不能和内置冲突(如不能叫
email或identity),否则你的函数永远不会被调用
form.validate() 手动触发不拦截提交?那是你没用对
在 form.on('submit') 回调里调 form.validate(),它不会自动阻止表单提交。Layui 的默认拦截只发生在原生 type="submit" 按钮点击那一刻。
- 想手动控制流程:把按钮改成
type="button",然后在 click 里调form.validate(function(valid){ if(!valid) return; /* 发请求 */ }) -
form.validate()的第二个参数是失败回调,不是成功回调;成功时它不返回任何值,别等它返回true - 自定义规则函数中,返回
false或字符串才报错,返回undefined或true视为通过
真正容易被忽略的点是:规则名冲突、空值逻辑版本差异、以及手动验证时对提交行为的误判——这三个地方出错,调试起来往往绕半天才意识到不是正则写错了,而是框架根本没走到你的函数里。











