
Reactλ₯Ό μ¬μ©ν΄ κ°λ°μ νλ€λ³΄λ©΄ λ€μν input μμλ₯Ό μ¬μ©ν΄ formμ λ€λ£¨κ² λ©λλ€.
μ΄ λ Reactμμ formμ λ€λ£¨λ μ ν΅μ μΈ λ°©μμ λͺ κ°μ§ λ¬Έμ μ μ κ°μ§κ³ μμ΅λλ€.
πΎ Reactμμ formμ λ€λ£¨λ μ ν΅μ μΈ λ°©μ(λ¬Έμ μ )
- Reactμμλ μν(State)λ₯Ό μ΄μ©ν΄ μ¬μ©μκ° μ λ ₯νλ κ°μ κ΄λ¦¬νλ λ°©μμ μ¬μ©ν©λλ€. μ λ ₯κ°κ³Ό react μνκ° νμ λκΈ°νλλλ‘ λ³΄μ₯νμ§λ§, μ¬μ©μκ° μ λ ₯ν λλ§λ€ μνλ₯Ό μ λ°μ΄νΈνκ³ μ»΄ν¬λνΈλ₯Ό 리λ λλ§ν©λλ€. formμ input νλκ° λ§κ±°λ λΉλ²ν μν μ λ°μ΄νΈκ° μΌμ΄λλ©΄ μ±λ₯ μ νλ₯Ό μ λ°ν©λλ€.
- λͺ¨λ form νλμ μνλ₯Ό μλμΌλ‘ κ΄λ¦¬ν΄μΌ ν©λλ€. λ°λΌμ μνλ₯Ό κ΄λ¦¬νλ λ‘μ§μ΄ 볡μ‘ν΄μ§ μ μμ΅λλ€. νΉν, λμ μΈ form νλλ₯Ό λ€λ£° λ μ½λμ 볡μ‘μ±μ΄ λ§€μ° μ¦κ°ν©λλ€.
- κ° input νλλ§λ€
onChangeνΈλ€λ¬λ₯Ό μ€μ νκ³ , νΈλ€λ¬ λ΄μμ μνλ₯Ό μ λ°μ΄νΈνλ λ‘μ§μ λ°λ³΅μ μΌλ‘ μμ±νκ² λλ©΄μ μ½λμ μ€λ³΅μ΄ λ°μν©λλ€. formμ΄ μ»€μ§ μλ‘ λ λ§μ μ½λλ₯Ό μμ±ν΄μΌ ν©λλ€.- formμ κ° input νλμ μ ν¨μ± κ²μ¬ λ‘μ§μ μ§μ μ€μ νκ³ , μλ¬ λ©μμ§λ₯Ό κ΄λ¦¬νλ λ‘μ§μ μΆκ°μ μΌλ‘ μμ±ν΄μΌ ν©λλ€. 볡μ‘ν formμμλ λ‘μ§μ΄ μλΉν 볡μ‘ν΄μ§κ³ μ½λμ κ°λ μ±κ³Ό μ μ§λ³΄μμ±μ μ ν΄ν©λλ€.
- formμ μ μΆ(submit)ν λ, κ° inputμ μνλ₯Ό λͺ¨μμ μ²λ¦¬ν΄μΌνκ³ , μ ν¨μ± κ²μ¬λ₯Ό μνν νμμΌ submit λ‘μ§μ μ€νν μ μμ΅λλ€. λ°λΌμ μ ν¨μ± κ²μ¬λ₯Ό ν΅κ³Όνμ§ λͺ»ν κ²½μ°μ λ‘μ§κΉμ§ ꡬνν΄μΌ ν©λλ€.
π§ μ ν΅μ form μμ
import { useState } from 'react'; function Form() { // ππ» λͺ¨λ νλμ μνλ₯Ό useStateλ‘ μ μΈν΄μΌ νλ€. const [ email, setEmail ] = useState(''); const [ password, setPassword ] = useState(''); const [ errors, setErrors ] = useState({}); const validateForm = () => { let valid = true; let errors = {}; // ππ» κ° νλμ μ ν¨μ± κ²μ¬ λ° μ΄λ²€νΈ νΈλ€λ¬λ₯Ό νλ νλ λ‘μ§μ λ§λ€μ΄μΌ νλ€. if(!email) { errors.email = 'μ΄λ©μΌμ νμλ‘ μ λ ₯νλ μμμ λλ€.'; valid = false; } //... return valid; } //... return ( <form onSubmit={handleSubmit}> <input name='email' value='email' onChange={(e) => setEmail(e.target.value)} /> {errors.email && <p>{errors.email}</p>} ... </form> ); }
μ΄λ¬ν λ¬Έμ λ€μ ν΄κ²°νκ³ formμ λ μ½κ² κ΄λ¦¬ν μ μλλ‘ ν΄μ£Όλ λΌμ΄λΈλ¬λ¦¬κ° React-Hook-Formμ λλ€. React Hooksλ₯Ό κΈ°λ°μΌλ‘ μ±λ₯ μ΅μ νμ κ°λ° νΈμμ±μ λͺ¨λ κ³ λ €ν΄ μ€κ³λ λΌμ΄λΈλ¬λ¦¬λ‘ 2024λ κΈ°μ€μΌλ‘ React μνκ³μμ μΈκΈ°λ₯Ό μ»κ³ μμ΅λλ€.
React-Hook-Formμ μ¬μ©νλ©΄ λΆνμν μ λ°μ΄νΈμ 리λ λλ§μ μ΅μννκ³ μνκ΄λ¦¬μ μ ν¨μ± κ²μ¬ λ‘μ§μ λ κ°κ²°νκ³ ν¨μ¨μ μΌλ‘ μμ±ν μ μμ΅λλ€.
λν νμ μ€ν¬λ¦½νΈλ₯Ό μ§μνμ¬ formμ νμ μμ μ±μ 보μ₯ν©λλ€. μ΄λ κ°λ°μ μ€λ₯λ₯Ό μ€μ΄κ³ μ½λ νμ§μ ν₯μμν΅λλ€.
$ npm i react-hook-form
# νΉμ
$ yarn add react-hook-form
ν°λ―Έλμ΄λ 컀맨λλΌμΈμ ν΅ν΄ νλ‘μ νΈμ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ€μΉν©λλ€.
Reactμ μν(State)λ₯Ό μ¬μ©νμ§ μκ³ , DOM μ체λ₯Ό ν΅ν΄ μ§μ μ μ΄κ³ μλμ μΌλ‘ μ λ ₯ κ°μ μ μ₯νκ³ κ΄λ¦¬νλ κ²μ λΉμ μ΄ μ»΄ν¬λνΈλ₯Ό μ¬μ©ν΄ μνλ₯Ό κ΄λ¦¬νλ€κ³ ν©λλ€. (μΌλ°μ μΌλ‘ Reactλ μ μ΄ μ»΄ν¬λνΈλ₯Ό μ¬μ©ν©λλ€.)
μ¦, μ¬μ©μκ° κ°μ μ
λ ₯νλ©΄ μ
λ ₯λ λ°μ΄ν°λ μλμΌλ‘ input, select, textareaλ± μμμ νμ¬κ°μΌλ‘ μ€μ λμ΄ λΈλΌμ°μ λ΄λΆμ μ μ₯λ©λλ€. μ΄λ¬ν λμμ΄ Reactλ JSλΌμ΄λΈλ¬λ¦¬/νλ μμν¬ μμ΄ μμHTMLκ³Ό λΈλΌμ°μ λ§μΌλ‘ λμν©λλ€. λ°λΌμ μΉ λΈλΌμ°μ μ νκ²½μμ μ¬μ©λκ³ , SSRμ΄λ λ€μ΄ν°λΈ μ± λ±μ λ€λ₯Έ νκ²½μμλ μ§μ μ μΌλ‘ μ μ©λμ§ μμ΅λλ€.
μλ°μ€ν¬λ¦½νΈλ React μν κ΄λ¦¬ μμ€ν μ μ°ννμ¬ μΈμ λ μ§ DOMμΌλ‘ μ§μ κ°μ μ‘°νν μ μμ΄, μ λ ₯μλ§λ€ μνλ₯Ό μ λ°μ΄νΈνκ±°λ 리λ λλ§ νμ§ μμ λΆνμν 리λ λλ§μ μ€μ¬ μ±λ₯μ ν₯μμν΅λλ€. λ, μνλ₯Ό μ§μ κ΄λ¦¬νμ§ μμλ λμ΄ μ½λκ° κ°κ²°ν΄μ§κ³ μ²λ¦¬ λ‘μ§μ΄ λ¨μν΄μ§λλ€.
useForm)μνκ΄λ¦¬, submit, μ
λ ₯κ° κ°μ, μλ¬λ©μμ§ μ²λ¦¬ λ±μ λ€μν μμ
μ useForm() ν
μ ν΅ν΄ κ°κ²°νκ² μ²λ¦¬ν μ μμ΄ ν¨μ¨μ μΌλ‘ ꡬννκ³ λ°μ΄ν°λ₯Ό κ΄λ¦¬ν μ μμ΅λλ€.
π§ React-Hook-Form Example
useFormν μ μ¬μ©νλ©΄useStateλ‘ μνλ₯Ό κ΄λ¦¬ν νμκ° μκ³ ,onChangeνΈλ€λ¬λ₯Ό ꡬνν νμλ μμ΅λλ€. μ ν¨μ± κ²μ¬ κ·μΉμ μ½κ² μ μ©ν μ μκ³ , μλ¬λ©μμ§λ₯Ό μλμΌλ‘ μ²λ¦¬ν μ μμ΅λλ€.
- λ€μμ
useFormν μ μ¬μ©ν΄ λ§λ κ°λ¨ν form μμμ λλ€. (vs. React μ ν΅μ form μμμ μ½λ μ λΉκ΅ν΄ λ§μ΄ κ°μμ‘μμ μ£Όλͺ©ν΄μ£ΌμΈμπ)// ππ» μ°μ useForm ν μ import ν©λλ€. import { useForm } from 'react-hook-form'; function Form() { // ππ» useForm ν μμ μ¬λ¬ ν¨μλ₯Ό ꡬ쑰λΆν΄ν λΉ ν©λλ€. const { register, handleSubmit, watch, formState: {errors} } = useForm(); // submit μ μ²λ¦¬ν λμμ μ ν©λλ€. (handleSubmit() ν¨μμ μΈμλ‘ λ€μ΄κ° μ½λ°±ν¨μ) // onSubmit()μ μ ν¨μ± κ²μ¬λ₯Ό ν΅κ³Όν κ²½μ° μ€νλκ³ , onError()λ μ€ν¨ν κ²½μ° μ€νλ λμμ λλ€. const onSubmit = data => console.log(data); const onError = errors => console.error(errors); return ( // ππ» onSubmit event handlerμ handleSubmit()ν¨μμ onSubmit, onError μ½λ°±ν¨μλ₯Ό λ£μ΄ λ±λ‘ν©λλ€. <form onSubmit={handleSubmit(onSubmit, onError)}> {/* ππ» form field λ±λ‘ : register() ν¨μλ₯Ό μ¬μ©ν΄ μ΄λ¦κ³Ό μ ν¨μ±κ²μ¬λ₯Ό μ λ¬ */} <input {...register('email', {required: 'email is required'}) } /> {/* ππ» form fieldμ μ ν¨μ± κ²μ¬ μλ¬κ° μλ€λ©΄ νμΈν΄ μλ¬λ©μμ§ νμνλ μ‘°κ±΄λΆ λ λλ§ */} {errors.email && <p>{errors.email.message}</p>} <input {...register('password', {required: 'password is required'}) } /> {errors.password && <p>{errors.password.message}</p>} <button type='submit'>μ μΆ</button> </form> ); }
useForm()μ λͺ¨λ μμ±μ νμΈνλ €λ©΄ μ¬κΈ°μμ νμΈνμΈμ π register()ν¨μλ₯Ό ν΅ν΄ formμ νλ(input, select λ±)λ₯Ό React-Hook-Formμ λ±λ‘ν©λλ€. μ΄λ₯Ό ν΅ν΄ React-Hook-Formμ΄ ν΄λΉ νλμ κ° λ³νλ₯Ό κ°μ§νκ³ , μ ν¨μ± κ²μ¬λ₯Ό μ€νν μ μλλ‘ ν©λλ€.
// ππ» useForm hookμμ register ν¨μλ₯Ό κ°μ Έμ¨λ€.
const { register } = useForm();
return (
//ππ» form λ΄μμ μ¬μ©νλ μ
λ ₯ νλλ₯Ό register ν¨μλ‘ λ±λ‘νλ€.
<input {...register('field_name', { required: true })} />
);
useForm()ν
μμλ handleSubmit()ν¨μλ₯Ό μ 곡νκ³ μμ΅λλ€. μ΄ ν¨μλ μ μΆ(submit) μ΄λ²€νΈ λ°μμ formDataλ₯Ό μΈμλ‘ λ°μ μ€νλ λ κ°μ μ½λ°±ν¨μλ₯Ό λ°μ΅λλ€. νλλ λ΄λΆμ μΌλ‘ μ ν¨μ± κ²μ¬λ₯Ό ν΅κ³Όν κ²½μ°μ νΈμΆν ν¨μ(onSubmit)λ‘ μ€μ λ°μ΄ν° μ²λ¦¬ λ‘μ§μ μννκ³ , νλλ μ€ν¨ν κ²½μ° νΈμΆν ν¨μ(onError)μ
λλ€.
// ππ» useForm ν
μμ handleSubmit ν¨μλ₯Ό κ°μ Έμ΅λλ€.
const { handleSubmit } = useForm();
const onSubmit = data => console.log(data);
const onError = errors => console.error(errors);
return (
// ππ» onSubmit μ½λ°±ν¨μλ₯Ό handleSubmitν¨μμ μΈμλ‘ λ£μ΄ onSubmit μ΄λ²€νΈμ λ±λ‘ν©λλ€.
<form onSubmit={handleSubmit(onSubmit, onError)}>
{/*Form Field */}
</form>
)
}
errors κ°μ²΄λ form νλμ μ ν¨μ± κ²μ¬ μλ¬λ₯Ό μ μ₯νκ³ μμ΅λλ€. ν
μ ν΅ν΄ κ° νλμ λν μλ¬λ₯Ό νμΈνκ³ μ‘°κ±΄λΆ λ λλ§μΌλ‘ μλ¬ λ©μμ§λ₯Ό μ¬μ©μμκ² νμν μ μμ΅λλ€.
//ππ» μ ν¨μ± κ²μ¬ μ€ν¨μ ꡬ체μ μΈ μ΄μ λ₯Ό λ΄μ κ°μ²΄
const { errors } = useForm();
return (
...
{errors.field_name && <p>{errors.field_name.message}</p>}
...
);
watch() ν¨μλ₯Ό ν΅ν΄ νΉμ μ
λ ₯λμ κ°μ΄λ, form μ 체μ μ
λ ₯ κ°μ λ³νλ₯Ό μ€μκ°μΌλ‘ κ°μν μ μμ΅λλ€. κ°μνκ³ μ νλ νλ μ΄λ¦μ μΈμλ‘ λ°κ³ , ν΄λΉ νλμ νμ¬ κ°μ λ°νν©λλ€.
watch()λ₯Ό ν΅ν΄ formμ νΉμ λΆλΆμ 쑰건λΆλ‘ λ λλ§νκ±°λ, μ
λ ₯ κ°μ λ°λΌ μΆκ°μ μΈ λ‘μ§μ μνν΄μΌ ν λ μ μ©νκ² μ¬μ©ν μ μμ΅λλ€.
function Form() {
const { watch } = useForm();
const fieldValue = watch('field_name'); // ππ» νΉμ νλμ κ°μ κ°μν΄ νμ¬ κ°μ fieldValueμ μ μ₯
// ππ» fieldValue κ°μ μ¬μ©ν΄ λ€μν λ‘μ§ μν κ°λ₯!
}
mode : mode μ΅μ
μΌλ‘ μ ν¨μ± κ²μ¬κ° μ€νλ νμ΄λ°μ μ€μ ν μ μμ΅λλ€.onChange(default, νλ κ°μ΄ λ³κ²½λ λλ§λ€ μ ν¨μ±μ μ¬κ²μ¬)onBlur(ν¬μ»€μ€λ₯Ό μμμ λ μ ν¨μ± μ¬κ²μ¬)onSubmit(μ μΆμμλ§ μ ν¨μ±μ μ¬κ²μ¬) λ±μ΄ μμ΅λλ€.const { register, handleSubtmi, watch, errors } = useForm({ mode: 'onSubmit' });
defaultValues : form νλκ° λ λλ§λ λ κ° νλμ μ μ©λ μ΄κΈ°κ°μ μ€μ ν μ μμ΅λλ€.const { register, handleSubtmi, watch, errors } = useForm({ defaultValues: {name: 'newha'} });
reValidateMode : μ ν¨μ± κ²μ¬μμ μλ¬κ° λ°μν κ²½μ°, λ€μ κ²μ¬ν 쑰건μ μ€μ ν μ μμ΅λλ€.const { register, handleSubtmi, watch, errors } = useForm({ reValidateMode: 'onSubmit' });
resolver : Yup, Joi, Superstruct μκ°μ μΈλΆ κ²μ¦ μ€ν€λ§ λΌμ΄λΈλ¬λ¦¬μμ ν΅ν©μ μ§μν©λλ€. resolver ν¨μλ₯Ό μ μνκ³ , ν¨μ λ΄μμ μΈλΆ λΌμ΄λΈλ¬λ¦¬μ μ ν¨μ± κ²μ¬ λ‘μ§μ μ€νν ν, κ²°κ³Όλ₯Ό λ°λ³΅ν΄ 볡μ‘ν κ²μ¦ λ‘μ§μ λ³΄λ€ μ μΈμ μΌλ‘ κ΄ν΅ν©ν΄ μ¬μ©ν μ μμ΅λλ€. yupResolverκ³Ό κ°μ resolverκ° μμ΅λλ€.μ¬μ©μκ° μ λ ₯λμ μ¬λ°λ₯Έ λ°μ΄ν°λ₯Ό μΌλμ§(μ ν¨μ± κ²μ¬) μ½κ² νμΈν μ μλ λ°©λ²μ μ 곡ν©λλ€.
νμν data νμκ³Ό μ¬μ©μκ° μ λ ₯ν data νμμ΄ κ°μμ§ νμΈνμ¬ λ°μ΄ν°μ μ νμ±μ 보μ₯νκ³ , μ¬μ©μμκ² μ ν¨ν νμμ μλ €μ£Όμ΄ λ λμ μ¬μ©μ κ²½νμ μ 곡νλ κ²μ¬λ₯Ό μ ν¨μ± κ²μ¬λΌκ³ ν©λλ€.
μλ₯Ό λ€μ΄ 'μ΄λ©μΌ μ£Όμκ° μ¬λ°λ₯Έ νμμΈκ°?', 'λΉλ°λ²νΈκ° μΆ©λΆν μμ νκ°?' κ°μ μ ν¨μ±μ μ½κ³ ν¨κ³Όμ μΌλ‘ κ²μ¦ν μ μμ΅λλ€.
κ°λ¨ν κ²μ¦ κ·μΉμ register() ν¨μμ κ°μ²΄ ννλ‘ μ λ¬νμ¬, νΉμ μ
λ ₯λμ λν κ²μ¦ λ‘μ§μ ꡬνν μ μμ΅λλ€.
// μμΌλ‘ μ€λͺ
μμμ μμ μ½λκ° {κ²μ¦κ·μΉ} λΆλΆμ λ€μ΄κ°κ² λ©λλ€.
<input ref={register({/* ππ»κ²μ¦ κ·μΉ!!!!!ππ» */})} />
required : νμλ‘ μ
λ ₯λμ΄μΌ νλ νλμμ λνλ΄κ³ , μ¬μ©μλ ν΄λΉ νλλ₯Ό λΉμ μ μΆν μ μμ΅λλ€. {required: true} νΉμ {required: 'νμλ‘ μ
λ ₯ν΄μΌ ν©λλ€.'}μ κ°μ΄ μλ¬λ©μμ§λ₯Ό ν¬ν¨ν΄ μ μ μ μμ΅λλ€.
minLength / maxLength : λ¬Έμμ΄μ΄λ λ°°μ΄μ κΈΈμ΄μ μ μ©ν΄ μ
λ ₯κ°μ μ΅μ κΈΈμ΄μ μ΅λ κΈΈμ΄λ₯Ό μ§μ ν©λλ€. {minLength: 6}(μ΅μ 6κΈμ μ΄μ)κ³Ό κ°μ΄ μ μ μ μμ΅λλ€.
min / max : μ«μ μ
λ ₯ νλμμ μ΅μκ°κ³Ό μ΅λκ°μ μ§μ νμ¬ κ°μ λ²μλ₯Ό μ νν μ μμ΅λλ€. {min: 1, max: 5}(μ΅μ 1μ΄μ, μ΅λ 5μ΄ν)μ κ°μ΄ μ¬μ΄μ μ
λ ₯κ°μ μꡬν μ μμ΅λλ€.
pattern : μ
λ ₯κ°μ΄ νΉμ ν¨ν΄(μ κ·ννμ)κ³Ό μΌμΉνλλ‘ ν μ μμ΅λλ€. μ΄λ©μΌ μ£Όμ, μ νλ²νΈ λ± μ²λΌ νΉμ νμμ κ°μΆ λ¬Έμμ΄μ κ²μ¬ν μ μμ΅λλ€. {pattern: /^[A-Za-z]+$/}(μνλ²³λ§ μΈμ )μ²λΌ νΉμ νμμ μꡬν μ μμ΅λλ€.
νΉμ 쑰건μ λ°λΌ form fieldλ₯Ό λ€λ₯΄κ² κ²μ¦ν΄μΌ ν κ²½μ°, μ μ°νκ² μ‘°κ±΄λΆλ‘ 컀μ€ν κ²μ¦ κ·μΉμ ꡬνν μ μμ΅λλ€. μλ₯Ό λ€μ΄, λΉλ°λ²νΈ νμΈλκ³Ό κ°μ΄ λ μ λ ₯λμ κ°μ΄ μΌμΉνλ μ§ νμΈνλ λ±μ μμ μμ μ¬μ©ν μ μμ΅λλ€.
const { register, handleSubmit, watch, errors } = useForm({
// μ
λ ₯λμ λν μ ν¨μ± κ²μ¬λ₯Ό μ μν μ μμ΅λλ€.
validate: {
confirmPassword: value => {
const password = watch('password'); // ππ» λΉλ°λ²νΈ μ
λ ₯λμ κ°μ κ°μ Έμ€κΈ°
if(value !== password) {
return "λΉλ°λ²νΈμ μΌμΉνμ§ μμ΅λλ€.";
}
return ture; // ππ» μ ν¨μ± κ²μ¬ ν΅κ³Ό
}
}
});
import { FormProvider, useForm, SubmitHandler } from 'react-hook-form'
export default function SignUpPage() {
const Form = FormProvider;
const form = useForm();
const onSubmitSignUp = async (formData) => {
// supabaseμ κ°μ
μμ²νλ ν¨μμ μ
λ ₯λ°μ formDataλ₯Ό λκΈ°λ onSubmit ν¨μ
await signUpEmail(formData);
};
return (
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmitSignUp)}>
<input type="text"
name="email"
options={{ // ππ» optionsμ κ·μΉ"κ°μ²΄"λ₯Ό μ λ¬ν΄μΌν©λλ€.
required: "νμνλͺ©μ
λλ€.", // ππ» νμμ
λ ₯λμ΄λΌλ 쑰건
pattern: { // ππ» patternμΌλ‘ μ΄λ©μΌ νμμ κ²μ¬νλ "μ κ·ννμ"κ³Ό μλ¬λ©μμ§λ₯Ό μ λ¬
value: /^([a-z0-9_.-]+)@([\da-z.-]+)\.([a-z.]{2,6})$/,
message: "μ΄λ©μΌ νμμΌλ‘ μ
λ ₯ν΄μ£ΌμΈμ.",
},
}}
placeholder="μ΄λ©μΌ μ£Όμλ₯Ό μ
λ ₯νμΈμ."
/>
<span>{form.formState.errors[email]?.message}</span> // ππ» μλ¬κ° μλ€λ©΄ λ©μμ§λ₯Ό λμ
<input type="password"
name="password"
options={{
required: "λΉλ°λ²νΈλ₯Ό μ
λ ₯ν΄μ£ΌμΈμ.",
minLength: { // ππ» μ΅μ κΈΈμ΄ κ²μ¦ & μλ¬λ©μμ§
value: 8,
message: "μλ¬Έ, μ«μ, νΉμκΈ°νΈλ₯Ό ν¬ν¨νμ¬ 8μ리 μ΄μ μ
λ ₯ν΄μ£ΌμΈμ.",
},
pattern: {
value: /^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-])(?=.*[0-9]).{8,15}$/,
message:
'μλ¬Έ, μ«μ, νΉμκΈ°νΈλ₯Ό ν¬ν¨νμ¬ 8μ리 μ΄μ μ
λ ₯ν΄μ£ΌμΈμ.',
},
}}
placeholder="λΉλ°λ²νΈλ₯Ό μ
λ ₯ν΄μ£ΌμΈμ"
/>
<span>{form.formState.errors[password]?.message}</span>
<input type="password"
name="ConfirmPassword"
options={{
required: "λΉλ°λ²νΈλ₯Ό νμΈν΄μ£ΌμΈμ.",
validate: { // ππ» validateλ‘ ν¨μλ‘ μ¬λ¬ κ²μ¦μ‘°κ±΄ μμ± κ°λ₯(True/False νλ¨)
confirmPassword: (value) => { // ππ» λΉλ°λ²νΈλκ³Ό λΉλ°λ²νΈ νμΈλμ μ
λ ₯κ°μ΄ κ°μ μ§ νμΈνλ ν¨μ
const { password } = form.getValues();
return ( // ππ» return κ°μ΄ λ¬Έμμ΄μ΄λ©΄ μλ¬λ©μμ§λ‘ 리ν΄νλ€.
password === value || "λΉλ°λ²νΈκ° μΌμΉνμ§ μμ΅λλ€."
);
},
},
}}
placeholder="λΉλ°λ²νΈλ₯Ό νμΈν΄μ£ΌμΈμ"
/>
<span>{form.formState.errors[confirmPassword]?.message}</span>
</form>
</Form>
);
}