react hook form
๐Ÿ“„

react hook form

์ž‘์„ฑ์ผ
2024๋…„ 10์›” 22์ผ
ํƒœ๊ทธ
์นดํ…Œ๊ณ ๋ฆฌ
Js๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
Last edited time
Last updated October 23, 2024
๋‚ ์งœ
ย 
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 ํ•˜๋‚˜๋งŒ ๋‚˜์˜จ๋‹ค.
notion image
๋งŒ์•ฝ all๋กœ ์„ค์ •ํ•  ๊ฒฝ์šฐ ๋ชจ๋“  ์—๋Ÿฌ๋ฅผ ๊ฐ์ง€ํ•œ๋‹ค.(types)
types ๊ฐ์ฒด์— ์—ฌ๋Ÿฌ๊ฐœ์˜ error๊ฐ€ ๋‚˜์˜จ๋‹ค.
notion image

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์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฒ•์ด ์•„๋ž˜ ๊ธฐ์ˆ ๋˜์–ด์žˆ์Œ
ย