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;