如何使用Zod实现确认密码的一致性校验?
使用Zod实现确认密码一致性校验
要验证密码与确认密码的一致性,你可以利用Zod的.refine()方法添加自定义校验逻辑,以下是两种常用实现方式:
方式一:对整个Schema对象添加校验(推荐)
这种方式直接针对整个表单对象做校验,逻辑清晰且便于维护:
import z from "zod"; export const registerUserSchema = z.object({ firstName: z.string(), lastName: z.string(), userName: z.string(), email: z.string().email(), phone: z.string().transform(data => Number(data)), password: z.string().min(4), confirmPassword: z.string().min(4), avatar: z.string().optional(), isVerified: z.boolean().optional() }).refine((formData) => formData.password === formData.confirmPassword, { message: "密码与确认密码不匹配", path: ["confirmPassword"] // 将错误关联到confirmPassword字段,方便前端定位输入框 });
说明
.refine()接收两个参数:第一个是校验函数,返回false时触发错误;第二个是错误配置对象。path属性指定错误归属的字段,前端处理校验错误时,能直接把提示信息显示在确认密码输入框下方。
方式二:针对confirmPassword字段单独校验
如果你希望校验逻辑绑定在确认密码字段上,可以用以下写法:
import z from "zod"; export const registerUserSchema = z.object({ firstName: z.string(), lastName: z.string(), userName: z.string(), email: z.string().email(), phone: z.string().transform(data => Number(data)), password: z.string().min(4), confirmPassword: z.string().min(4).refine((value, context) => { // 通过context.parent获取表单中的password字段值 return value === context.parent.password; }, { message: "密码与确认密码不匹配" }), avatar: z.string().optional(), isVerified: z.boolean().optional() });
两种方式都能实现需求,优先推荐第一种,因为它的校验逻辑更直观,也更容易扩展其他跨字段校验规则。
内容的提问来源于stack exchange,提问作者Ushahemba Shir
相关产品推荐
相关产品推荐

