見た目をくらべる
同じものを、それぞれのライブラリで作りました。触ってみてください
書き方をくらべる
コードを書き換えると、右の見た目が変わります
このデモを自分のプロジェクトで動かすには:npx shadcn@latest add button input label
import { useForm } from "react-hook-form"
import { zodResolver } from "@hookform/resolvers/zod"
import { z } from "zod"
import { Button } from "./components/ui/button"
import { Input } from "./components/ui/input"
import { Label } from "./components/ui/label"
const schema = z.object({
email: z.email("メールアドレスの形で入力してください"),
password: z.string().min(8, "8文字以上にしてください").regex(/[0-9]/, "数字を含めてください"),
})
type FormValues = z.infer<typeof schema>
export default function App() {
const {
register,
handleSubmit,
formState: { errors },
} = useForm<FormValues>({ resolver: zodResolver(schema) })
const onSubmit = (values: FormValues) => {
alert("ログイン:" + values.email)
}
return (
<form onSubmit={handleSubmit(onSubmit)} className="flex flex-col gap-4 p-5">
<div className="flex flex-col gap-2">
<Label htmlFor="email">メールアドレス</Label>
{}
<Input id="email" {...register("email")} />
{}
{errors.email && (
<p className="text-sm text-destructive">{errors.email.message}</p>
)}
</div>
<div className="flex flex-col gap-2">
<Label htmlFor="password">パスワード</Label>
<Input id="password" type="password" {...register("password")} />
{errors.password && (
<p className="text-sm text-destructive">{errors.password.message}</p>
)}
</div>
<Button type="submit">ログイン</Button>
</form>
)
}