const formSubmitssionHandler = (event) => {
event.preventDefault();
if (enteredName.trim() === "") {
}
console.log("useState :", enteredName);
};
νΌμ μ μΆνλ νΈλ¦¬κ±° ν¨μμΈ formSubmitssionHandler
μμμ if
λ¬Έμ μΆκ°νκ³ , μ¬μ©μ μ
λ ₯ κ°μ μν(state)λ‘ κ΄λ¦¬ν΄μ£Όκ³ μλ enteredName
μ trim()
μ μ¬μ©ν΄μ 곡백μ μμ€ μνκ° λΉμ΄μμ λλ₯Ό κ°μ ν΄λ³΄μ.
μ΄λ μ ν¨μ± κ²μ¦μ μ¬μ©λλ 쑰건λ€μ μ΄λ€ μ λ ₯ κ°μ λ°λλμ λ¬λΌμ§ κ²μ΄λ€. λ¨μν μ΄λ¦μ΄λΌλ©΄ μ λ ₯λμ΄ λΉμ΄μλμ§λ§ νμΈνλ©΄ λ κ²μ΄κ³ , μ΄λ©μΌ μ£ΌμλΌλ©΄ μ ν¨ν μ΄λ©μΌ μ£ΌμμΈμ§ κ²μ¦ν΄μΌ ν κ²μ΄λ€.
const formSubmitssionHandler = (event) => {
event.preventDefault();
if (enteredName.trim() === "") {
return;
}
console.log("useState :", enteredName);
};
enteredName
μ΄ λΉμ΄μλ€λ©΄, ν΄λΉ μ½λμ λ€μμΌλ‘ μ§νλμ§ μλλ‘ return μ ν΄μ€λ€. μ΄λ κ² νλ μ΄μ λ μ
λ ₯λ κ°μ μ¬μ©ν΄μ 무μΈκ°λ₯Ό ν΄μΌ νλλ°, κ°μ΄ λΉμ΄μλ€λ©΄ μ΄νμ μμ
λ€μ ν νμλ μκΈ° λλ¬Έμ΄λ€. μ§κΈμ κ²½μ°λΌλ©΄ μ
λ ₯λ κ°μ΄ λΉμ΄μλ€λ©΄ μ½μμ ν΄λΉ enteredName
μ μΆλ ₯λμ§ μμ κ²μ΄λ€.const [enteredNameIsValid, setEnteredNameIsValie] = useState(true);
enteredNameIsValid
λ boolean μΌλ‘ μ²λ¦¬λλ enteredName
μ μ ν¨μ±μ μνλ₯Ό κ΄λ¦¬ν΄μ£Όλ μν(stete)κ° λ κ²μ΄λ€.const formSubmitssionHandler = (event) => {
event.preventDefault();
if (enteredName.trim() === "") {
setEnteredNameIsValie(false);
return;
}
setEnteredNameIsValie(true);
console.log("useState :", enteredName);
setEnteredName("");
};
if
λ¬Έ λ΄λΆμ return νμ¬ ν΄λΉ ν¨μκ° μ’
λ£λκΈ° μ μ setEnteredNameIsValid
λ₯Ό false
λ‘ μ
λ°μ΄νΈ ν΄μ£Όκ³ , μ ν¨μ± κ²μ¬κ° true κ° λμμ λλ setEnteredNameIsValid
λ₯Ό true
λ‘ μ
λ°μ΄νΈ ν΄μ€λ€.<input
ref={nameInputRef}
type="text"
id="name"
onChange={nameInputChangeHandler}
value={enteredName}
/>;
{
!enteredNameIsValid && <p className="error-text">Name must not be empty.</p>;
}
{}
λ₯Ό μΆκ°νκ³ , enteredNameIsValid
κ° false μΌ λ μ΄λ€ κ²½κ³ λ©μΈμ§λ₯Ό λμΈ μ μλλ‘ <p>
νκ·Έλ₯Ό μ¬μ©νμ¬ λ§ν¬μ
μ μμ±ν΄μ€λ€.<div className="form-control">
<label htmlFor="name">Your Name</label>
<input
ref={nameInputRef}
type="text"
id="name"
onChange={nameInputChangeHandler}
value={enteredName}
/>
{!enteredNameIsValid && <p className="error-text">Name must not be empty.</p>}
</div>
<div>
νκ·Έμ className μ λ³μλ‘ μμ±ν΄μ€λ€.const nameInputClasses = enteredNameIsValid
? "form-control"
: "form-control invalid";
return (
<form onSubmit={formSubmitssionHandler}>
<div className={nameInputClasses}>...</div>
</form>
);
const [enteredNameIsValid, setEnteredNameIsValie] = useState(true);
enteredNameIsValid
λΌλ μν(state)λ μ΄κΈ° κ°μ true λ‘, μ²μμ μ
λ ₯μ μ ν¨νλ€κ³ μ·¨κΈνλ€λ μλ―Έμ΄λ©° μ ν¨νμ§ μμΌλ©΄ falseλ‘ λ³νλλ‘ νλ€. μ΄λ λ¨μ§ μ ν¨μ± κ²μ¬μμ μ°λ¦¬κ° μ€μ ν μλ¬λ₯Ό μ΄λ°μ λμ°μ§ μκΈ° μν λͺ©μ μΌλ‘ μ€μ λ κ²μ΄λ©°, μΌμ’
μ μμμμ λ κ°κΉλ€. κ·Έλ¦¬κ³ μ΄ enteredNameIsValid
μν κ°μ μ ν¨μ±μ μΆλ ₯ν λλ₯Ό μ μΈνκ³ λ μ¬μ€ νμνμ§ μκΈ°μ λͺ©μ μλ§ λΆν©νλ λΆμ νν λ°©μμΌλ‘ μ²λ¦¬λ₯Ό ν΄μ£Όμλ€. κ·Έλ¦¬κ³ μ΄λ μ΄λ€ λ¬Έμ λ₯Ό μΌμΌν¬ κ°λ₯μ±μ λ΄ν¬νκ³ μλ€λ λ»μ΄λ€.enteredNameIsValid
μ μν κ°μ΄ λ¬Έμ κ° λλ μ΄μ const [enteredNameIsValid, setEnteredNameIsValie] = useState(true);
useEffect(() => {
if (enteredNameIsValid) {
// true μΌ λ
console.log("Name Input Is valid!"); // μ½μμ μΆλ ₯νλ€
}
}, [enteredNameIsValid]);
useEffect
λ₯Ό ν΅ν΄ enteredNameIsValid
κ° true μΌ λλ§λ€ μ€μ μ±μ μ½μ μ°½μμ μ΄λ€ ν
μ€νΈλ₯Ό μΆλ ₯νλλ‘ ν΄λ³΄μ.enteredNameIsValid
μνλ₯Ό trueλ‘ μ½κ°μ λΆμ ννκ² μ€μ νκΈ° λλ¬Έμ λ°μνλ λ¬Έμ μΈλ°, μ΄λ μμν λ μ΄ κ°μ΄ μ ν¨νλ€λ λ»μ΄ μλλ©°, λ€λ§ μ³μ§ μμ κ²μ΄λΌλ μ΄μΌκΈ°λ€. κ·Έλ¦¬κ³ μ΄λ λ¨μ§ μλ¬μ λν νΌλλ°±μ μ£ΌκΈ° μν μμλ°©νΈμΌ λΏμ΄λ€. λ§μ½ useEffect
κ° μμλ€λ©΄ μ΄λ κ² νΈλ²μ μ΄μ©νλλΌλ μ€μ§μ μΈ μν΄κ° μμΌλ λ§μ‘±ν μ§ λͺ¨λ₯Έλ€. νμ§λ§ κ·Έλ λ€κ³ νλλΌλ μ΄ μ½λκ° μ’μ μ½λλΌλ μλ―Έλ μλ κ²μ΄λ€.const [enteredNameIsValid, setEnteredNameIsValie] = useState(false);
enteredNameIsValid
κ° μ²μλΆν° true μΌλ¦¬λ μκΈ° λλ¬Έμ΄λ€. μ€νλ € μ΄ μν(state)μ μ΄κΈ° κ°μ false μ¬μΌ λ μμ°μ€λ¬μ 보μΈλ€. λ°λΌμ μ°λ¦¬λ μΈ λ²μ§Έ μν(state)λ₯Ό μΆκ°νκ³ μ νλ€.const [enteredNameTouched, setEnteredNameTouched] = useState(false);
enteredNameTouched
μνλ κΈ°λ³Έμ μΌλ‘ μ¬μ©μκ° μ
λ ₯ μ°½μ μ
λ ₯ν΄μ enteredName
μ΄ μλμ§λ₯Ό νμΈνκΈ° μν λͺ©μ μΌλ‘ μΆκ°νμλ€. κ·Έλ¦¬κ³ μ΄ κ°μ μ΄κΈ° κ°μ μ΄ν리μΌμ΄μ
μ΄ μμλμ μ¦μ μ¬μ©μκ° μ
λ ₯μ°½μ 건λλ¦¬μ§ μμμ κ²μ΄κΈ° λλ¬Έμ false λ‘ μ§μ νλ€.enteredNameIsValid
μ enteredNameTouched
λ₯Ό μ‘°ν©νμ¬ μ ν¨μ± κ²μ¦ μ½λ μ
λ°μ΄νΈ νκΈ°enteredNameIsValid
μ enteredNameTouched
λ₯Ό μ‘°ν©νμ¬ μλ¬ λ©μΈμ§λ₯Ό μΆλ ₯νλ λͺ©μ μΌλ‘ μ¬μ©νκ³ , μ΄λ₯Ό ν΅ν΄μ invalid
ν΄λμ€λ₯Ό λν΄μ€ μ μλλ‘ νλ€. μ΄μ enteredNameTouched
μνλ₯Ό ν΅ν΄μ μ
λ ₯ κ°μ΄ μ ν¨νμ§λ₯Ό 체ν¬ν¨κ³Ό λμμ μ¬μ©μκ° μ
λ ₯ μ°½μ 건λλ Έλμ§μ λν μ¬λΆλ 체ν¬ν μ μκΈ° λλ¬Έμ΄λ€. κ·Έλ¦¬κ³ λ§μ½ μ¬μ©μκ° μ
λ ₯μ°½μ 건λ릴 κΈ°νμ‘°μ°¨ μμλ€λ©΄, μλ¬ λ©μΈμ§λ₯Ό λμΈ μ΄μ κ° μμ κ²μ΄λ€.const nameInputIsInvalid = !enteredNameIsValid && enteredNameTouched;
nameInputIsInvalid
λ₯Ό μΆκ°νκ³ , enteredNameIsValid
λ false μ΄κ³ , enteredNameTouched
λ true μΌ λ true κ°μ΄ λ μ μλλ‘ μμ±νλ€. μ¬μ©μκ° μ
λ ₯μ°½μ 건λ리기 μμνλ©΄μ κ°μ΄ μ ν¨νμ§ μμ λλ§ μ ν¨μ± κ²μ¦μ νκΈ° μν΄μλ€.{
!enteredNameIsValid && <p className="error-text">Name must not be empty.</p>;
}
!enteredNameIsValid
μνμ &&
μ ν΅ν΄μ μλ¬ λ©μΈμ§λ₯Ό λμ°λλ‘ μ€μ νμλλ°, μ΄μ nameInputIsInvalid
μΌλ‘ 쑰건문μ λ체ν΄μ€ μ μκ² λμλ€.{
nameInputIsInvalid && <p className="error-text">Name must not be empty.</p>;
}
nameInputIsInvalid
μΌ λλ§ μλ¬ λ©μΈμ§λ₯Ό λμ°λλ‘ μ‘°κ±΄λ¬Έμ μμ±νλ€. nameInputIsInvalid
μμλ μ°λ¦¬κ° μμμ μμ±ν κ²μ²λΌ enteredNameIsValid
λ false μ΄λ©΄μ λμμ enteredNameTouched
λ true μΌ λλ₯Ό μλ―Έν κ²μ΄λ€.const nameInputClasses = enteredNameIsValid // true μ΄λ©΄,
? "form-control"
: "form-control invalid"; // κ²½κ³ css
enteredNameIsValid
μνλ₯Ό μ΄μ©ν΄μ ν΄λμ€λͺ
μ 쑰건문μΌλ‘ ν λΉν κ² μμ nameInputIsInvalid
μΌλ‘ μμ ν΄μ€λ€.const nameInputClasses = nameInputIsInvalid // true μ΄λ©΄,
? "form-control invalid" // κ²½κ³ css
: "form-control";
nameInputIsInvalid
κ° true μΌ λλ μ ν¨μ± κ²μ¦μμ false λΌλ λ»μ΄λ―λ‘ invalid
ν΄λμ€ λͺ
μ nameInputIsInvalid
κ° true μΌ λ κ°μ Έκ° μ μλλ‘ μμ ν΄μΌνλ€λ κ²μ΄λ€.enteredNameIsValid
μ μ΄κΈ°κ°μ falseλ‘ μ€μ ν΄λμμμλ μ²μμ μλ¬ λ©μΈμ§κ° μΆλ ₯λμ§ μμΌλ©΄μ μ½μμλ μλ¬΄λ° λ©μΈμ§κ° μΆλ ₯λμ§ μλ κ±Έ μ μ μλ€. νμ§λ§ λ¬Έμ λ Submit λ²νΌμ ν΄λ¦ν΄λ μ΄μ μ²λΌ μλ¬΄λ° λ³νκ° μΌμ΄λμ§ μλλ€. μ μΌκΉ?enteredNameTouched
μν μ
λ°μ΄νΈνκΈ°enteredNameTouched
μνλ₯Ό μ
λ°μ΄νΈν μ μ΄ μκΈ° λλ¬Έμ΄λ€. λ¬Όλ‘ μ΄ λΆλΆμ μ΄λ»κ² ν μ§λ κ°μμ μ νμ λ¬λ €μλ€. λ§μ½ νΌμ΄ μ μΆ λμλ€λ©΄ λΉμ°ν enteredNameTouched
λ μ
λ°μ΄νΈ λμ΄μΌ νλ€. νΌμ΄ μ μΆλ μνλΌλ©΄ μ¬μ©μκ° μλ¬΄λ° ν
μ€νΈλ μ
λ ₯νμ§ μμλλΌλ μ 체 νΌμ μ μΆν κ²μ΄κ³ μ΄λ μ¬μ©μκ° μ 체 νΌμ νμΈνλ€λ μλ―Έμ΄κΈ°λ νκΈ° λλ¬Έμ λͺ¨λ μ
λ ₯μ°½μ μ¬μ©μκ° κ±΄λλ Έμμ μ μ λ‘ μ¬κ²¨μ ΈμΌ ν μ§λ λͺ¨λ₯Έλ€. λ°λΌμ μ΄λ° κ²½μ°μλ μ¬μ©μκ° λͺ¨λ μ
λ ₯μ°½μ 건λλ¦° κ²μ μ μ λ‘ enteredNameTouched
μ μ
λ°μ΄νΈ νκ³ μ νλ€.const formSubmitssionHandler = (event) => {
event.preventDefault();
if (enteredName.trim() === "") {
setEnteredNameIsValie(false);
return;
}
setEnteredNameIsValie(true);
setEnteredName("");
};
enteredName
μ if
λ¬Έμ ν΅ν΄μ μ ν¨μ±μ κ²μ¦νκΈ° μ μ νΌμ΄ μ μΆλ κ·Έ μκ° setEnteredNameTouched
μ μ
λ°μ΄νΈνλλ‘ ν΄μΌ νλ€. μλνλ©΄ μ¬κΈ°μ νΌμ΄ μ μΆλλ μκ° λͺ¨λ μ
λ ₯ μ°½μ μ¬μ©μκ° νμΈνλ€κ³ λ³Ό μλ μκΈ° λλ¬Έμ΄λ€.const formSubmitssionHandler = (event) => {
event.preventDefault();
setEnteredNameTouched(true);
if (enteredName.trim() === "") {
setEnteredNameIsValie(false);
return;
}
setEnteredNameIsValie(true);
setEnteredName("");
};
π¨ ν΄λΉ ν¬μ€ν μ Udemyμ βReact μλ²½ κ°μ΄λβ κ°μλ₯Ό λ² μ΄μ€λ‘ ν κΈ°λ‘μ λλ€.
βπ» κ°μ git repo λ°λ‘κ°κΈ°