[Next.js ํ”„๋กœ์ ํŠธ] React Hook Form ๊ณผ Zod ๋กœ ํšŒ์› ๊ฐ€์ž… ํผ ๋งŒ๋“ค๊ธฐ

react hook from ๊ณผ zod ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํšŒ์›๊ฐ€์ž… ํผ์„ ๋งŒ๋“ค์—ˆ๋‹ค.

 

React hook Form ์„ค์น˜

yarn add react-hook-form

 

Zod ์„ค์น˜

yarn add zod

// react hook form ์ด๋ž‘ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ ์„ค์น˜
yarn add @hookform/resolvers

 

์ฝ”๋“œ

"use client";

import { FieldValues, useForm } from "react-hook-form";
import { z } from "zod";
import { zodResolver } from "@hookform/resolvers/zod";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { signup } from "./actions";

const signUpSchema = z.object({
  email: z
    .string()
    .min(1, {
      message: "์ด๋ฉ”์ผ ์ž…๋ ฅํ•˜์…ˆ",
    })
    .email({
      message: "์ด๋ฉ”์ผ ์ œ๋Œ€๋กœ ์ž…๋ ฅํ•˜์…ˆ",
    }),
  password: z.string(),
  name: z.string(),
  nickname: z.string(),
});

const SignUp = () => {

  const { register, handleSubmit, formState, setError } = useForm({
    mode: "onChange",
    resolver: zodResolver(signUpSchema),
  });

  const handleSignUp = async (data: FieldValues) => {
  		... ํšŒ์›๊ฐ€์ž… ๋กœ์ง
  };

  return (
    <div className="flex flex-col items-center justify-center h-lvh gap-3">
      <h2>Culinary War Store</h2>
      <form
        onSubmit={handleSubmit(handleSignUp)}
        className="flex flex-col gap-5 w-6/12"
      >
        <input
          placeholder="์ด๋ฉ”์ผ"
          {...register("email")}
          className="border-solid border-2"
        />
        {formState.errors.email && <p>{formState.errors.email.message}</p>}

        <input
          type="password"
          placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ"
          {...register("password")}
          className="border-solid border-2"
        />

        <input
          type="text"
          placeholder="์ด๋ฆ„"
          {...register("name")}
          className="border-solid border-2"
        />

        <input
          type="text"
          placeholder="๋‹‰๋„ค์ž„"
          {...register("nickname")}
          className="border-solid border-2"
        />
        <button type="submit">ํšŒ์›๊ฐ€์ž…</button>
      </form>
      <p>
        ์ด๋ฏธ ๊ณ„์ •์ด ์žˆ์œผ์‹ ๊ฐ€์š”? <Link href={"/login"}>๋กœ๊ทธ์ธ</Link>{" "}
      </p>
    </div>
  );
};

export default SignUp;