ย
watch๋ฆฌ๋๋๋ง ํด๊ฒฐย
const { register, handleSubmit, setError, getValues, watch, resetField, clearErrors, getFieldState, setValue, trigger, formState: { errors, isValid,isLoading,isSubmitted,isSubmitting }, } = useForm<IFormInput>({ mode: 'onSubmit', reValidateMode: 'onChange', defaultValues: {}, resolver: undefined, context: undefined, criteriaMode: 'firstError', shouldFocusError: true, shouldUnregister: false, delayError: undefined, });
formState โ ํ์ฌ form์ ์ํ๋ฅผ ์ถ์ ๊ฐ๋ฅํจ.
erorrs๋ ํ์ฌ ์๋ฌ aria-invalid = {errors.email ? โtrueโ : โfalseโ } ํผํ
๋๋ฆฌ
isSubmitting ์ ํผ์ด ์ ์ถ์ค์ธ์ง ex) ๋ฒํผ disabled์ ํ ๋นํด์์ ์ถ์ค์๋ ํด๋ฆญ๋ชปํ๊ฒ
isSubmitted ํผ์ด ์ ์ถ ํ๋์ง (ํ๋ฒ์ด๋ผ๋ ์ ์ถํ๋์ง ํ์ธํ๋๋ฐ์ฐ์)
form ์์ฑ์ ์์ aria ์์ฑ ์ฐธ๊ณ
ย
. ๐งฎ useForm : props
ย
5.1. useForm Props : mode
onChange | onBlur | onSubmit(default) | onTouched | all ='onSubmit'BASH
mode๋ form์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ด๋ ๋์๋ ์ํํ ์ง ์ค์ ํ๋ props์ด๋ค.
onChange๋ ๊ณผ๋ํ ๋ ๋๋ง์ผ๋ก ์ฑ๋ฅ์ ์ ํ๋๋ฌธ์ ๋น์ถ์ฒ์ด๊ณ , all๋ onChange๊ฐ ํฌํจ๋์ด ๊ณผ๋ํ ๋ ๋๋ง์ ๋ฐ์์ํค๊ธฐ ๋๋ฌธ์ ๋น์ถ์ฒ
5.2. useForm Props : reValidateMode
reValidateMode: onChange(default) | onBlur | onSubmit ='onChange'BASH
form์ ์ ์ถํ ํ(์๋ฅผ ๋ค์ด onSubmit ์ด๋ฒคํธ ์) ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋, ๋ค์ ์ ํจ์ฑ ๊ฒ์ฌํ ๋ ์ด๋ ๋์์ ์ํํ ์ง ์ค์ ํ๋ props์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์
๋ ฅ๊ฐ์ ์
๋ ฅํ์ฌ change ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ๋ค.
5.3. useForm Propsย : defaultValues
defaultValues: Record<string, any> = {}BASH
form์ ๊ธฐ๋ณธ๊ฐ์ ์ธํ
ํ ๋ ์ค์ ํ๋ props์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก <input>ํ๊ทธ์ defaultValue๋ฅผ ์ค์ ํ๋ฉด <input>ํ๊ทธ ์์ ๊ฐ์ ๊ฐ์ง๋ค.๊ทธ๋ฌ๋ useForm์ defaultValues๋ฅผ ์ฌ์ฉํ๋ฉด, <input>ํ๊ทธ ์์ ๊ฐ์ ๊ฐ์ง์ง ์๋๋ค.
5.4. useForm Propsย : resolver
resolver: (values: any, context?: object) => Promise<ResolverResult> | ResolverResultBASH
resolver๋ ์ ํจ์ฑ ๊ฒ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์์ฃผ๋ props์ด๋ค.
์ฌ์ค ์ ํจ์ฑ ๊ฒ์ฌํ ๋ ์ ๊ท์ ํํ์ ์ฌ์ฉํ์ง, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด๋ณด์ง ์์์ ๊ณต๋ถํ ๋ง์์ด ์์ด์ก๋ค.
๋์ค์ ์ ํจ์ฑ ๊ฒ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด, ๋ค์ ๊ณต๋ถํด์ ์ ๋ฆฌ ํด๋ด์ผ๊ฒ ๋ค.
5.5. useForm Props : context
context: objectBASH
context๋ ์ ํจ์ฑ ๊ฒ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Yup ์ context๋ก ์ฌ์ฉ๋๋ props์ด๋ค.
context๋ resolver์ ์ฐ๊ด๋ props์ด๋ค. ๋ฐ๋ผ์ ๋ฐ๋ก ์ ๋ฆฌํ์ง ์์๋ค.
5.6. useForm Propsย : shouldUnregister
shouldUnregister: boolean =true |false(default)BASH
form์ด unmount๋๋ฉด ๊ฐ์ด ์ฌ๋ผ์ง๊ฒ ๋ง๋ค์ง, ์๋์ง ์ค์ ํ๋ props์ด๋ค.
๊ธฐ๋ณธ๊ฐ์ false๋ก ์ค์ ๋์ด ์๋ค.
๋ง์ฝ true๋ก ์ค์ ํ๊ณ , form์ด unmount๋๋ฉด ์
๋ ฅ๋์๋ ๊ฐ์ด ๋ชจ์กฐ๋ฆฌ ์ฌ๋ผ์ง๋ค.
์ด ์ํ์์ submitํ๊ฒ ๋๋ฉด, ๊ฐ์ ์๋ ์ํ๋ก ์ ๋ฌ๋๊ธฐ ๋๋ค.
5.7. useForm Props : criteriaMode
criteriaMode : firstError(default) | allBASH
๊ธฐ๋ณธ๊ฐ์ธ firstError๋ register๋ก ๋ฑ๋ก๋ form์ ์๋ฌ๋ค ์ค, ์ฒซ๋ฒ์งธ ์๋ฌ๋ง ๊ฐ์งํ๋ค.(type)
type ๊ฐ์ฒด์ pattern type ํ๋๋ง ๋์จ๋ค.

๋ง์ฝ all๋ก ์ค์ ํ ๊ฒฝ์ฐ ๋ชจ๋ ์๋ฌ๋ฅผ ๊ฐ์งํ๋ค.(types)
types ๊ฐ์ฒด์ ์ฌ๋ฌ๊ฐ์ error๊ฐ ๋์จ๋ค.

5.8. useForm Props : shouldFocusError
shouldFocusError: boolean =true(default) |falseBASH
์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํ๊ณ ๋์, ์๋ฌ๊ฐ ๋ฐ์ํ form์ focus๋ฅผ ์ํํ ์ง ์ค์ ํ๋ props์ด๋ค.
focus๋ register๋ฅผ ๋ฑ๋กํ ์์(์์์ ์๋๋ก) ์งํ๋๋ค.
5.9. useForm Props : delayError
delayError : numberBASH
์๋ฌ๋ฉ์์ง๋ฅผ ํ์ํ๊ธฐ๊น์ง ์ง์ฐ์๊ฐ์ ์ค์ ํ๋ props์ด๋ค.
๋จ, ์ ํจ์ฑ ๊ฒ์ฌ ํต๊ณผํ์ฌ ์๋ฌ๋ฉ์์ง๊ฐ ์ฌ๋ผ์ง๋ ๊ฒ์๋ ์ ์ฉ๋์ง ์๊ณ , ๋ฐ๋ก ์ฌ๋ผ์ง๋ค.
5.10. useForm Props : shouldUseNativeValidation
shouldUseNativeValidation: boolean =false(default) |trueBASH
๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ณธ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ์ฑํ์ํค๋ props์ด๋ค.
๋ํ, :valid, :invalid์ ๊ฐ์ CSS ์ ํ์๋ฅผ ์ฌ์ฉํ์ฌ, styling์ ํ ์ ์๋ค.
ํ์ฑํํด๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒฝํ๊ฒ ์ ํจ์ฑ๊ฒ์ฌ๋ฅผ ํ์ง ์๊ธฐ๋๋ฌธ์, ๋ฐ๋ก ์ ํจ์ฑ๊ฒ์ฌ๋ฅผ ํ๋ ํธ์ด ์ข์๊ฑฐ ๊ฐ๋ค.
ย
ย
ย
register
// ์์ const { onChange, onBlur, name, ref } = register('firstName'); <input onChange={onChange} // assign onChange event onBlur={onBlur} // assign onBlur event name={name} // assign name prop ref={ref} // assign ref prop /> // ๊ฐํธ์ <input {...register('firstName')} />
ย
ย
9. ๐ฎ components์ register ๋ฑ๋กํ๊ธฐ
์ผ๋ฐ์ ์ธ ํ๊ทธ์๋ register๋ {...register}๋ฅผ ํ๋ฉด ๋ฑ๋ก์ด๋๋ค.
๊ทธ๋ฌ๋, components๋ค์ {...register}๋ฅผ ์ด์ฉํ์ฌ ๋ฑ๋กํ ์ ์๋ค.
๊ทธ๋์ register์ props๋ค์ ํ๋์ฉ ๋ฑ๋กํด์ค์ผํ๋ค.
// not working, because ref is not assigned <TextInput {...register('test')} /> const firstName = register('firstName', { required:true }) <TextInput onChange={firstName.onChange} onBlur={firstName.onBlur} inputRef={firstName.ref} // you can achieve the samefor different ref name such as innerRef />
ย
ย
react hook form์ ๋น์ฐํ ํด๋ผ์ด์ธํธ ๋ก์ง์ด๋ค
server action์ผ๋ก nextjs์์ ์ฒ๋ฆฌํ๋๋ฒ์ด ์๋ ๊ธฐ์ ๋์ด์์
ย



