From 7fa73728582e2dfb26ff89786c27dd9da97bebc2 Mon Sep 17 00:00:00 2001 From: Masaya Tojo Date: Mon, 5 Aug 2024 23:26:43 +0900 Subject: zod でバリデーションを試す MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SignUp.tsx | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to 'src/SignUp.tsx') diff --git a/src/SignUp.tsx b/src/SignUp.tsx index d812b35..2a7f448 100644 --- a/src/SignUp.tsx +++ b/src/SignUp.tsx @@ -1,9 +1,73 @@ import './SignUp.css' +import { useState } from "react"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import * as z from "zod" + +const schema = z.object({ + name: z.string(), + email: z.string().email("それメアドじゃないよ"), + birthday: z.coerce.date().max(new Date(), { message: "まだ生まれてないじゃん" }), + language: z.string(), +}) + +type Answer = { + name: string, + email: string, + birthday: Date, + language: string, +} export const SignUp = () => { + const { register, handleSubmit, reset, formState: { errors } } = useForm({ + resolver: zodResolver(schema) + }); + const [answer, setAnswer] = useState(null); + + const yourAnswer = answer ? ( + <> +

あなたの情報です

+
+
おぬしの名前は…
+
{answer.name}
+
おぬしのメアドは…
+
{answer.email}
+
あなたの誕生日
+
{answer.birthday.getFullYear()}年{answer.birthday.getMonth()}月{answer.birthday.getDay()}日
+
おぬしの好きなプログラミング言語は…
+
{answer.language}
+
+ + ) : (<>) + return ( <>

会員登録

+
setAnswer(data))}> + + + {errors.name?.message} + + + {errors.email?.message &&

{errors.email?.message}

} + + + {errors.birthday?.message &&

{errors.birthday?.message}

} + + + {errors.language?.message &&

{errors.language?.message}

} + + +
+ + {yourAnswer} ); } -- cgit v1.2.3