์ฐ๋ฆฌ๋ ์ง๊ธ๊น์ง ๋ชจ๋ state๋ฅผ ์ง์ ๋ง๋ค๊ณ , onChange ํจ์๋ ์ผ์ผ์ด ๋ง๋ค์ด์ ๋ฐ์ธ๋ฉํ๋ค. ์ด์ ์ด ๋ถ๋ถ์ *ํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ๊ฐํธํ๊ฒ ๋ง๋ค ์ ์๋ค!
ํจ์ํ ์ปดํฌ๋ํธ์ ๊ฐ์ฅ ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ ์ฑ๋ฅ์ ์ผ๋ก ์ข์ ํผ์ react-hook-form์ด๋ค!
์ฐ๋ฆฌ๊ฐ ์ด์ ์ ์ฌ์ฉํ๋ onChange๋ฅผ ๋ง๋ค์ด์ setState๋ฅผ ํด์ฃผ๊ณ ๋ฐ์ธ๋ฉํ๋ ๋ฐฉ๋ฒ์ state๊ฐ ๋ณํํ ๋๋ง๋ค ๋ ๋๋ง์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ด์๋ค. ๋ํ ๋ณํํ state๋ฅผ ๋ฐ์์ ๋ฆฌ๋ ๋๋งํ๊ธฐ ๋๋ฌธ์ ๊ต์ฅํ ๋๋ฆฌ๋ค๋ ๋จ์ ์ด ์๋ค.
ํ์ง๋ง react-hook-form
์ ์ค์๊ฐ์ผ๋ก ๊ฐ์ state์ ๋ฐ์ํ๋ ๊ฒ์ด ์๋ ๋ฑ๋กํจ์๊ฐ ์คํ๋ ๋ ํ๋ฒ์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ๋ ๋๋ง์ ์ ๊ฑฐํ ์ ์์ด์ ๋น ๋ฅด๊ณ ํจ์จ์ ์ด๋ค.
์ด๋ ๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ *๋น์ ์ด ์ปดํฌ๋ํธ
๋ผ๊ณ ํ๋ค. react-hook-form์ ๋น์ ์ด์ปดํฌ๋ํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์๋ค.
์ ์ด ์ปดํฌ๋ํธ: ์ฌ์ฉ์์ ์ ๋ ฅ์ ๊ธฐ๋ฐ์ผ๋ก state๊ฐ ์ค์๊ฐ์ผ๋ก ๋ณ๊ฒฝ๋จ(setState ์ฌ์ฉ).
๋น์ ์ด ์ปดํฌ๋ํธ: ๋ฑ๋กํจ์๋ฅผ ์คํํ ๋ ํ๋ฒ์ ๊ฐ์ ๋ณ๊ฒฝ
๊ธฐ๋ณธ์ ๋น์ ์ด์ปดํฌ๋ํธ
๋ฅผ ์ฌ์ฉํ๊ณ , ์ํฉ์ ๋ฐ๋ผ ๋ณต์กํ ํผ์ด ํ์ํ ๋ ์ ์ด์ปดํฌ๋ํธ
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค!
npm install react-hook-form
yarn add react-hook-form
const ReactHookForm = ()=>{
// react-hook-form ์์ useForm ์ ๊ณต
const {register , handleSubmit} = useForm()
// ๋ฑ๋กํ๊ธฐ ํจ์ -> handleSubmit์ด ์กฐ์ข
ํด์ฃผ๋ ํจ์
const onClickSubmit = (data)=>{
console.log(data)
}
return(
<form onSubmit={handleSubmit(onClickSubmit)}>
<input type="text" {...register("writer")}/>
<input type="text" {...register("title")}/>
<input type="text" {...register("contents")}/>
<button type="reset"> ๋ฑ๋กํ๊ธฐ </button>
</form>
)
}
export default ReactHookForm
useForm์์ register, handleSubmit, form
register : state๋ฅผ ๋ฑ๋กํ๋๋ฐ ํ์ํ ๋ชจ๋ ๊ธฐ๋ฅ์ด ๋ค์ด์๋ค.
handleSubmit : register์ ์ ํ state๋ฅผ ๋ฑ๋กํด์ฃผ๋ ํจ์
form: ์ค์ html์ ์๋ input๋ค์ ๋ฌถ์ด์ฃผ๋ ํ๊ทธ
form
ํ๊ทธ์๋ input์ ์ ํ ๋ด์ฉ์ ์ ์กํ๋ ๊ธฐ๋ฅ์ด ์๋ค.
๋ํ button
ํ๊ทธ์ type
์ reset์ ์ฃผ๊ฒ ๋๋ฉด ํด๋ฆญ์์ ํผ ์์ ์๋ input ๊ฐ์ ์ด๊ธฐํํ๋ค. type์ ๊ธฐ๋ณธ ๊ฐ์ submit์ด๋ค. submit์ผ ๊ฒฝ์ฐ, form ํ๊ทธ์ ๋ฐ์ธ๋ฉ๋ submit ํจ์๋ฅผ ์คํ์ํค๊ฒ ๋๋ค.
๋ง์ฝ form ํ๊ทธ ๋ด์์ form๊ณผ ์๊ด์๋ ๋ฒํผ์ ๋ง๋ค์ด์ผ ํ๋ค๋ฉด, type์ button์ผ๋ก ์ค์ผ ํ๋ค.
form ๋ด๋ถ์ button type ๊ฐ๋จ ์ ๋ฆฌ
reset : form ๋ด๋ถ์ input ๊ฐ์ด ๋ชจ๋ ์ญ์ ๋จ
submit : form ๋ด๋ถ์ input ๊ฐ์ด ๋ฐฑ์๋๋ก ๋ณด๋ด์ง โ ๊ธฐ๋ณธ๊ฐ
button : ๋๋ง์ ๋ฒํผ์ ๋ง๋ค๊ณ ์ถ์๋ ์ฌ์ฉ
์ง๊ธ๊น์ง๋ ํน์ ๋ฐ์ดํฐ๊ฐ ์ซ์์ธ์ง, ๋ฌธ์์ธ์ง, ์ต์ 8์๋ฆฌ์ธ์ง ๋ฑ์ ๊ฒ์ฆ์ ์ง์ ๋ง๋ค์ด์ผ ํ๋ค.
yup
์ ์ด๋ ๊ฒ ๋ณต์กํ ๊ฒ์ฆ๊ณผ์ ์ ๋์ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
yup์ ๋ณดํต form
๊ณผ ํจ๊ป ์ฌ์ฉํ๋ค. ๊ทธ๋์ react-hook-form๊ณผ ํจ๊ป ์ฌ์ฉํด๋ณด์๋ค.
yarn add @hookform/resolvers yup
yup
๊ด๋ จ ์ฝ๋๋ฅผ ์์ฑํ๊ณ , resolver
์ ์ฐ๊ฒฐํด์ฃผ๊ธฐimport * as yup from 'yup'
import {useForm} from 'react-hook-form'
import {yupResolver} from '@hookform/resolvers/yup'
// yup ์๋ฌ๋ฉ์ธ์ง ์์ฑ -> ์ ์ด ์ปดํฌ๋ํธ ํํ๋ก ์ฌ์ฉํด์ผ ํจ.
const schema = yup.object().shape({
myWriter : yup.string().email('์ด๋ฉ์ผ ํ์์ด ์ ํฉํ์ง ์์ต๋๋ค.').required('ํ์ ์
๋ ฅ๊ฐ์
๋๋ค.')
myPassword : yup.string().min(4,'๋น๋ฐ๋ฒํธ๋ ์ต์ 4์๋ฆฌ ์ด์์
๋๋ค.').max(15,'๋น๋ฐ๋ฒํธ๋ ์ต๋15์๋ฆฌ ์
๋๋ค.').required('ํ์ ์
๋ ฅ๊ฐ ์
๋๋ค.')
})
const ReactHookForm = ()=>{
//formState์์ ์๋ฌ๋ฉ์ธ์ง๋ค์ ๋ฐ์์ด.
const {register , handleSubmit, formState} = useForm({
// schema๋ ์์์ ๋ง๋ค์ด ๋ schema
resolver : yupResolver(schema),
mode : "onChange"
})
// ๋ฑ๋กํ๊ธฐ ํจ์ -> handleSubmit์ด ์กฐ์ข
ํด์ฃผ๋ ํจ์
const onClickSubmit = (data)=>{
console.log(data)
}
return(
<form onSubmit={handleSubmit(onClickSubmit)}>
์ด๋ฉ์ผ : <input type="text" {...register("myEmail")}/>
// ์ฐ๋ฆฌ๊ฐ ์์ฑํ yup์ ์๋ฌ๋ฉ์ธ์ง๋ ํญ์ errors์ ๋ด๊ธฐ๋๋ฐ ์ด ์๋ฌ๋ ์์๋๋ ์๊ณ ์์ ๋๋ ์๊ธฐ ๋๋ฌธ์ ์ต์
๋ ์ฒด์ด๋์ ๋ถ์ฌ์ผ ํจ.
<div> {formState.errors.myEmail?.message}</div>
๋น๋ฐ๋ฒํธ : <input type="text" {...register("myPassword")}/>
<div> {formState.errors.myPassword?.message}</div>
<button styled={{ backgroundColor: formState.isValid ? "yellow" : "" }}> ๋ฑ๋กํ๊ธฐ </button>
</form>
)
}
export default ReactHookForm
์ต์ข
์ ์ผ๋ก ์๋ฌ๊ฐ ์๋์ง ์๋์ง ์๋์ง ํ์ธ ํ ๋ฒํผ์ ํ์ฑํ ํ๋ ๊ฒ์ formState์ isValid
๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
yup์ ์ ๊ทํํ์ ์ถ๊ฐํ๊ธฐ
yup.string().matches(/ ์ํ๋ ์ ๊ทํํ์! /)