Learning
Zod

Form validáció (gyakorlati)

Login/register schema-k, keresztmezős validáció refine-nal, fieldErrors flatten-nel, és React Hook Form integráció.

Alap form schema

import { z } from "zod"

const loginFormSchema = z.object({
  email: z.string().email("Érvényes email cím szükséges"),
  password: z.string().min(8, "A jelszónak legalább 8 karakter hosszúnak kell lennie"),
  rememberMe: z.boolean().optional().default(false),
})

type LoginFormData = z.infer<typeof loginFormSchema>

Jelszó megerősítés (cross-field)

const registerSchema = z
  .object({
    email: z.string().email(),
    password: z.string().min(8),
    confirmPassword: z.string(),
  })
  .refine((data) => data.password === data.confirmPassword, {
    message: "A két jelszó nem egyezik",
    path: ["confirmPassword"],
  })

Hibák mezőnként (flatten)

async function handleLoginSubmit(formData: FormData) {
  const rawData = {
    email: formData.get("email"),
    password: formData.get("password"),
  }

  const result = loginFormSchema.safeParse(rawData)
  if (!result.success) {
    return { errors: result.error.flatten().fieldErrors }
  }

  await loginUser(result.data)
}

React Hook Form integráció

import { useForm } from "react-hook-form"
import { zodResolver } from "@hookform/resolvers/zod"

function LoginForm() {
  const {
    register,
    handleSubmit,
    formState: { errors },
  } = useForm<LoginFormData>({
    resolver: zodResolver(loginFormSchema),
  })

  return (
    <form onSubmit={handleSubmit((data) => console.log(data))}>
      <input {...register("email")} />
      {errors.email && <span>{errors.email.message}</span>}

      <input type="password" {...register("password")} />
      {errors.password && <span>{errors.password.message}</span>}
    </form>
  )
}

On this page