form.verify()规则必须在layui.use(['form'], function(){})回调内注册,否则因异步加载失效;规则名不可与内置required、phone等重名;正则须用字面量而非字符串;提示文案不能为空;跨字段校验需手动取值并同步状态。

form.verify() 注册规则必须写在 layui.use 里
直接写 form.verify({ ... }) 但没包在 layui.use(['form'], function(){ ... }) 回调中,规则根本不会生效。Layui 的模块加载是异步的,form 实例还没就位,注册等于白写。
常见错误现象:页面刷新后验证没反应、控制台无报错、自定义规则函数压根不执行。
- 必须确保
layui.use的依赖数组包含'form' - 注册要放在回调函数内部,且通常在
form.render()之前(除非是动态插入的表单) - 如果用了模块按需加载(比如只引入了
laydate没引form),layui.form会是undefined,直接报错
规则名不能和内置规则重名
比如你写 form.verify({ phone: function(){...} }),Layui 会直接走它自己的 phone 校验逻辑,你的函数永远不会被调用——它根本不会进你注册的这个函数。
内置规则列表(v2.8+):required、phone、email、url、number、date、identity、pass。这些名字全部保留,碰都不能碰。
- 想校验手机号但要兼容带空格或括号?改用
mobile或myPhone - 想覆盖
required提示文案?注册required规则即可,它会覆盖内置行为(此时lay-reqtext失效) - 规则名建议加业务前缀,比如
orderAmount、couponCode,避免后期冲突
正则写法必须是字面量,不能是字符串
lay-verify 属性里写正则毫无作用,它只认规则名;而你在 form.verify() 里传正则,必须是 /^[a-z0-9]+$/ 这种字面量形式,写成 "^[a-z0-9]+$" 就会被忽略,校验永远通过。
示例正确写法:
form.verify({
username: [/^[a-z0-9_]{3,16}$/, '用户名只能是小写字母、数字、下划线,且3–16位']
});
- 正则字面量里如果有变量(比如动态长度),得用
new RegExp('^\w{' + minLen + ',' + maxLen + '}$'),注意双反斜杠转义 - 提示文案不能为空字符串或
undefined,否则失败时不显示任何提示 - 注册后记得调用
form.render(),特别是 Ajax 动态插入的表单
联动校验必须手动取值,不能靠 lay-verify="a b" 自动关联
“确认密码”要和“密码”字段比对,这种跨字段逻辑,lay-verify="required repass" 只是绑定规则名,具体怎么取另一个字段的值、怎么比,全得你写在规则函数里。
关键点不是“怎么比”,而是“怎么安全地取”:
- 用
layui.$而不是全局$,避免 jQuery 冲突 - 取值写成
layui.$('[name="password"]').val(),别用document.querySelector后再 .value,容易因渲染时机出错 - 函数返回
undefined表示通过,返回字符串(如'两次输入不一致')才报错;返回true或false都无效 - 主字段(如密码)修改时,应主动清掉确认密码字段的
layui-form-danger类并触发blur,否则状态不同步











