본문으로 건너뛰기

handleSubmit

</> handleSubmit: UseFormHandleSubmit

폼 검증에 성공하면 이 함수가 폼 데이터를 받습니다.

매개변수


이름타입설명
SubmitHandler(data: TFieldValues, e?: BaseSyntheticEvent) => TResult | Promise<TResult>성공 시 호출할 콜백입니다.
SubmitErrorHandler(errors: FieldErrors, e?: BaseSyntheticEvent) => unknown | Promise<unknown>오류 시 호출할 콜백입니다.
예제:

동기

import { useForm, SubmitHandler, SubmitErrorHandler } from "react-hook-form"

type FormValues = {
firstName: string
lastName: string
email: string
}

export default function App() {
const { register, handleSubmit } = useForm<FormValues>()
const onSubmit: SubmitHandler<FormValues> = (data) => console.log(data)
const onError: SubmitErrorHandler<FormValues> = (errors) =>
console.log(errors)

return (
<form onSubmit={handleSubmit(onSubmit, onError)}>
<input {...register("firstName")} />
<input {...register("lastName")} />
<input type="email" {...register("email")} />

<input type="submit" />
</form>
)
}

비동기

import { useForm } from "react-hook-form"

const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))

function App() {
const {
register,
handleSubmit,
formState: { errors },
} = useForm()
const onSubmit = async (data) => {
await sleep(2000)
if (data.username === "bill") {
alert(JSON.stringify(data))
} else {
alert("There is an error")
}
}

return (
<form onSubmit={handleSubmit(onSubmit)}>
<label htmlFor="username">User Name</label>
<input placeholder="Bill" {...register("username")} />

<input type="submit" />
</form>
)
}

변환된 값을 사용하는 리졸버

리졸버(Zod, Yup, Joi 또는 사용자 정의)가 제출 데이터를 변환해 출력 타입이 필드 입력 타입과 달라지는 경우, useForm의 세 번째 제네릭인 TTransformedValueshandleSubmit이 받을 타입을 TypeScript에 알려야 합니다. 이 타입을 지정하지 않으면 콜백이 입력(필드) 타입으로 지정되어 변환된 속성에 접근할 때 오류가 발생합니다.

import { useForm, SubmitHandler } from "react-hook-form"
import { zodResolver } from "@hookform/resolvers/zod"
import * as z from "zod"

// Example using Zod — the same pattern applies to any resolver whose
// output type differs from its input type (Yup, Joi, custom, etc.)
const schema = z
.object({
emailOrPhone: z.string().trim(),
})
.transform(({ emailOrPhone }) => ({
isEmail: emailOrPhone.includes("@"),
isPhone: /^\d+$/.test(emailOrPhone),
value: emailOrPhone,
}))

type FormInput = z.input<typeof schema> // { emailOrPhone: string }
type FormOutput = z.output<typeof schema> // { isEmail: boolean; isPhone: boolean; value: string }

export default function App() {
// 1st generic = field/input type (drives register, watch, etc.)
// 3rd generic = transformed output type (drives handleSubmit callback)
const { register, handleSubmit } = useForm<FormInput, unknown, FormOutput>({
resolver: zodResolver(schema),
})

const onSubmit: SubmitHandler<FormOutput> = (data) => {
console.log(data.isEmail, data.isPhone, data.value)
}

return (
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register("emailOrPhone")} />
<input type="submit" />
</form>
)
}

동영상


다음 동영상 튜토리얼에서는 handleSubmit API를 자세히 설명합니다.