๐ React Hook Form
๋ชจ๋ ๋ค์ด ๋ฐ๊ธฐ
npm install react-hook-form --save
useForm importํ๊ธฐ
import { UseForm } from 'react-hook-form'
register()
const { register } = useForm();
{...register("email")}
input ํ๊ทธ ์์ register ํจ์๋ฅผ spreadํด์ ๋ฃ์ด์ค ์ ์๋ค (ES6 ๋ฌธ๋ฒ)
watch()
const { watch } = useForm();
console.log(watch('email'))`
watch()
์ง์ ๋ input์ ๊ด์ฐฐํ๊ณ ํด๋น ๊ฐ์ ๋ฐํํ๋ค. ๊ด์ฐฐ ํ๋ ค๋ input ์์์ register๋ฅผ ๋ฑ๋กํด์ค๋ค.
*๋ฒ์ 7๋ถํฐ ๋ณ๊ฒฝ๋จ : ref={register} => {...register("email")}
์ฝ์์ ํ์ธํ๋ฉด ์
๋ ฅ์ํจ input์ ํ์ดํ๋๋ ๊ฐ์ด watch๋ก ํ๊ธฐ๊ฐ ๋๋๊ฒ์ ํ์ธํ ์ ์๋ค.
handleSubmit()
const { handleSubmit } = useForm();
const onValid = (data) => {
console.log(data);
}
<form onSubmit={handleSubmit(onValid)}>
...
handleSubmit์ React Hook Form์์ Submit์ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ง๋ ํจ์์ด๋ค.
react hook form์ด ๋ชจ๋ validation์ ๋ง์ณค์๋ ํธ์ถ๋๋ค.
handleSubmit์ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ์ผ๋ฉฐ ๊ทธ ํจ์์ data๋ผ๋ ์ธ์๋ฅผ ๋๊ฒจ์ค๋ค. ํ๋ฒ์ ๊ด๋ฆฌํ ์ ์์ด์ ํธ๋ฆฌํ๋ค.
validation ์ฒดํฌํ๊ธฐ
required๋ inputํ๊ทธ์์ ์ฌ์ฉํ๋ ์์ฑ์ด๋ค. ํ์ ์ ๋ ฅ ์ฌํญ์๋ required์์ฑ์ ์ฌ์ฉํ๋ค.
์ ํจ์ฑ ์ฒดํฌ์ ์กฐ๊ฑด ๋ฃ๊ธฐ
<input
type="text"
id="email"
{...register("email",
{
required: true,
pattern: {
value: /\S+@\S+\.\S+/,
message: "์ด๋ฉ์ผ ํ์์ ๋ง์ง ์์ต๋๋ค."}
})
}
/>
[์ ํจ์ฑ ๊ฒ์ฌ ์์ฑ]
required : ๋ฐ๋์ ์
๋ ฅํด์ผ ํ๋์ง ์ฒดํฌ
min : ์
๋ ฅ์ ํ์ฉ๋๋ ์ต์ ๊ฐ
max : ์
๋ ฅ์ ํ์ฉ๋๋ ์ต๋ ๊ฐ
minLength : ์
๋ ฅ์ ํ์ฉ๋๋ ์ต์ ๊ธธ์ด
maxLength : ์
๋ ฅ์ ํ์ฉ๋๋ ์ต๋ ๊ธธ์ด
pattern : ์
๋ ฅ์ ๋ํ ์ ๊ท์ ํจํด
validate: ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌํ๊ฑฐ๋ ์ฝ๋ฐฑ ํจ์์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ์ฌ ๊ฒ์ฆ
์ ํจ์ฑ ์ฒดํฌ ์ ์๋ฌ๋ฌธ๊ตฌ ์ค์
const { formState: { errors } } = useForm();
return (
<div>
<form onSubmit={handleSubmit(onSubmit)}>
<label htmlFor="email">์ด๋ฉ์ผ</label>
<input
...
{errors.email && errors.email.type === "required" && <p>this email field is required</p>}
{errors.email && errors.email.type === "pattern" && <p>์ฌ๋ฐ๋ฅธ ์ด๋ฉ์ผ์ ์
๋ ฅํ์ธ์</p>}
errors.email: error.email์ ์ ํจ์ฑ ์ฒดํฌ์ ๊ฑธ๋ ธ๋ค๋ฉด? : erros ๋ ๋๋ง ํด์ฃผ๊ธฐ
errors.email.type === "required": type์ด required์ธ error.email
ํน์ ์ด๋ฅด์ผ ํ ์ค์ด์ด
<input type="text"
className="useremail"
placeholder="์ด๋ฉ์ผ"
{...register("email", {
required: true,
pattern: {
value: /\S+@\S+\.\S+/,
message: '์ฌ๋ฐ๋ฅธ ํ์์ ์
๋ ฅํ์ธ์.'
}
})}
/>
{errors.email?.type === "required" && <p>์ด๋ฉ์ผ์ ์
๋ ฅํด ์ฃผ์ธ์.</p>}
{errors.email?.type === "pattern" && errors.email.message}
<span>{errors?.Email?.message}</span> :? : undefined์ฌ๋ ์คํํ๊ธฐ (not required)
์ด๋ฉ์ผ ์์ ์๋ฌด๊ฒ๋ ์์ ์ ์์ผ๋ฏ๋ก ?๋ฅผ ๋ฃ์ด์ค๋ค.
์ ์ถํ๊ณ ์๋ฌ๊ฐ ์์ ๋ผ react-hook์ด ๊ฒ์ฌ๋ฅผ ํตํด ์๋ฌ๋ฅผ ์ถ๋ ฅํ๋ค.
์๋ฌ ๋ฉ์ธ์ง๋, ๋จผ์ ๊ฐ์ฒด์์ ๋ฃ์ด๋๊ณ &&์ฐ์ฐ์ ๋ค์ message๋ก ๋ถ๋ฌ์จ๋ค.
ErrorMessage ์ปดํฌ๋ํธ
npm install @hookform/error-message
์ ํจ์ฑ ๊ฒ์ฌ์ ErrorMessage๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
<label>gender</label>
<select name="gender" id="gender"
{...register("gender", {
required: true
})}
>
<option value="">select...</option>
<option value="male">male</option>
<option value="female">female</option>
</select>
<ErrorMessage
errors={errors}
name="gender"
render={({ message }) => <p>{message} ์ฑ๋ณ์ ์ ํํ์ธ์</p>}
/>
์ ์ฒด ์ฝ๋ ํ์ธํ๊ธฐ
import { useForm } from 'react-hook-form'
import { ErrorMessage } from '@hookform/error-message'
export default function Signup2() {
const { register, formState: { errors }, handleSubmit } = useForm();
const onSubmit = data => console.log(data.required);
// ํ์์
๋ ฅ์ฌํญ์๋ required์์ฑ์ ์ฌ์ฉ
return (
<div>
<form onSubmit={handleSubmit(onSubmit)}>
<label htmlFor="email">์ด๋ฉ์ผ</label>
<input
type="text"
id="email"
{...register("email",
{
required: true,
pattern: /\S+@\S+\.\S+/
// pattern: {
// value: /\S+@\S+\.\S+/,
// message: "์ด๋ฉ์ผ ํ์์ ๋ง์ง ์์ต๋๋ค.",
// },
})
} />
{errors.email && errors.email.type === "required" && <p>this email field is required</p>}
{errors.email && errors.email.type === "pattern" && <p>์ฌ๋ฐ๋ฅธ ์ด๋ฉ์ผ์ ์
๋ ฅํ์ธ์</p>}
{/* email์ ์ ํจ์ฑ ์ฒดํฌ์ ๊ฑธ๋ ธ๋ค๋ฉด? erros ๋ ๋๋ง ํด์ฃผ๊ธฐ
์ ํจ์ฑ type์ด require๋ผ๋ฉด
*/}
<label htmlFor="name">์ด๋ฆ</label>
<input type="text"
id="name"
{...register("name",
{
required: true,
maxLength: 10
})
} />
{errors.name && errors.name.type === "required" && <p>this name field is required</p>}
{errors.name && errors.name.type === "maxLength" && <p>your input exceed maximun length</p>}
<label htmlFor="pw">๋น๋ฐ๋ฒํธ</label>
<input type="password"
id="pw"
{...register("pw",
{
required: true,
minLength: 8
})} />
{errors.pw && errors.pw.type === "required" && <p>this email field is required</p>}
{errors.pw && errors.pw.type === "minLength" && <p>your input exceed minLength length</p>}
<label htmlFor="pwComfirm">๋น๋ฐ๋ฒํธ ํ์ธ</label>
<input type="password"
id="pwComfirm"
{...register("pwComfirm")} />
<label>gender</label>
<select name="gender" id="gender"
{...register("gender", {
required: true
})}
>
<option value="">select...</option>
<option value="male">male</option>
<option value="female">female</option>
</select>
<ErrorMessage
errors={errors}
name="gender"
render={({ message }) => <p>{message} ์ฑ๋ณ์ ์ ํํ์ธ์</p>}
/>
<button type="submit">๊ณ์ ์์ฑ</button>
</form>
</div>
)
}
'Framework > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React ํ์๊ฐ์ API (๋ก๊ทธ์ธ ๊ธฐ๋ฅ ์ ) (0) | 2022.10.31 |
---|---|
React.memo, useCallback(), useMemo() (0) | 2022.10.26 |
๋ฆฌ์กํธ CRUD ํด๋ณด๊ธฐ (0) | 2022.10.22 |
React Context API (0) | 2022.10.12 |
conditional rendering (0) | 2022.10.11 |
๋๊ธ