const [enteredName, setEnteredName] = useState("");
const [enteredNameIsValid, setEnteredNameIsValie] = useState(false);
const [enteredNameTouched, setEnteredNameTouched] = useState(false);
<input
ref={nameInputRef}
type="text"
id="name"
onChange={nameInputChangeHandler}
onBlur={}
value={enteredName}
/>
<input>
ํ๊ทธ ์์ฑ์ onBlur
๋ฅผ ์ถ๊ฐํ๋ค. ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ด๋ฒคํธ ์์ฑ์ผ๋ก input ์์๊ฐ ํฌ์ปค์ค ์์ ๋๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ์์ ์ฌ์ฉํ ์ ์๋ค.const nameInputBlurHandler = (event) => {};
onBlur
์ ๋ฐ์ธ๋ฉํ ํจ์ nameInputBlurHandler
๋ฅผ ์์ฑํ๋ค. ์ด์ ์ด ํจ์์์๋ ๋ ๊ฐ์ง๋ฅผ ํ ๊ฒ์ธ๋ฐ,const nameInputBlurHandler = (event) => {
setEnteredNameTouched(true);
};
setEnteredNameTouched
๋ฅผ ์ฌ์ฉํด์ true ๋ก ์
๋ฐ์ดํธ ํด์ค ๊ฒ์ด๋ค. ์
๋ ฅ์ฐฝ์์ ํฌ์ปค์ค ์์ ๋์๋ค๋ ์๋ฏธ๋ ์ง์ ์ ์ฌ์ฉ์๊ฐ ์
๋ ฅ์ฐฝ์ ๊ฑด๋๋ ธ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ ์ ์๋ ์ด๋ฒคํธ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ์
๋ ฅํ ๊ธฐํ๊ฐ ์์๋ค๋ ๋ป์ด๋ค.const nameInputBlurHandler = (event) => {
setEnteredNameTouched(true);
if (enteredName.trim() === "") {
setEnteredNameIsValie(false);
return;
}
};
formSubmitssionHandler
์์ ์ถ๊ฐํด์ฃผ์๋ ์ ํจ์ฑ ๊ฒ์ฆ ๋ก์ง์ ๊ธ์ด์ ๊ทธ๋๋ก ๋ถ์ฌ๋ฃ๊ธฐ ํด์ค๋ค. ์ด ์ญ์ enteredName
๊ฐ ๊ณต๋ฐฑ์ด ์๋ ์ํ์์ ๋น ๋ฌธ์์ด์ธ์ง๋ฅผ ํ์ธํ๊ณ , ์ด ๊ฐ์ด ๋ง์ฝ ๋น ๋ฌธ์์ด์ด๋ผ๋ฉด enteredNameIsValid
๋ฅผ false ๋ก ๋ฐ๊ฟ์ค๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๊ฐ ์ค๋ณต๋์ง๋ง ์ดํ์ ๋ฆฌํฉํ ๋ง์ ํ ์์ ์ด๋ ๋ฏธ๋ฆฌ ๊ฑฑ์ ํ์ง ๋ง์.const nameInputChangeHandler = (event) => {
setEnteredName(event.target.value);
};
nameInputChangeHandler
ํจ์์ ์ฐ๋ฆฌ๊ฐ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ๋ ๋ก์ง์ ๊ทธ๋๋ก ๋ณต์ฌํด์ ๊ฐ์ ธ์จ๋ค.const nameInputChangeHandler = (event) => {
setEnteredName(event.target.value);
if (enteredName.trim() === "") {
setEnteredNameIsValie(false);
return;
}
};
setEnteredNameIsValie
์ false ๋ก ์
๋ฐ์ดํธํ๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ํค๋ฅผ ์
๋ ฅํ ๋๋ง๋ค ๊ฐ์ด ์ ํจํ์ง๋ฅผ ํ์ธํ๊ธฐ ์ํด์๋ ์ต๋ํ ๋น ๋ฅด๊ฒ ์ ํจํ์ง ์์์ ๋ ์ถ๋ ฅ๋๋ ์๋ฌ๋ฅผ ์ ๊ฑฐํด์ผ ํ๋ค. ๋ฐ๋ผ์ ์ฌ๊ธฐ์์๋ ์ฝ๊ฐ์ ๋ก์ง์ ์์ ํด์ผ ํ ํ์๊ฐ ์๋ค.const nameInputChangeHandler = (event) => {
setEnteredName(event.target.value);
if (enteredName.trim() !== "") {
setEnteredNameIsValie(true);
}
};
===
๋ฅผ !==
๋ก ๋ฐ๊พธ๊ณ , enteredName.trim()
์ด ๋น ๊ฐ์ด ์๋ ๋์ setEnteredNameIsValie
์ด true ๊ฐ ๋ ์ ์๋๋ก ์์ ํด์ฃผ์๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์กฐ๊ฑด๋ฌธ ๋ค์ ์คํํ ์ฝ๋๊ฐ ์๊ธฐ์ return ์ ํ์ ์์ด์ง๋ฏ๋ก ์ ๊ฑฐ ํ๋ค.const nameInputBlurHandler = (event) => {
setEnteredNameTouched(true);
if (enteredName.trim() === "") {
setEnteredNameIsValie(false);
}
};
nameInputBlurHandler
ํจ์ ๋ด๋ถ์ ๋ก์ง๋ return ์ ์ ๊ฑฐํ ์ ์๊ฒ ๋๋ค.const nameInputChangeHandler = (event) => {
setEnteredName(event.target.value);
if (enteredName.trim() !== "") {
setEnteredNameIsValie(true);
}
};
nameInputChangeHandler
ํจ์์์ ์
๋ ฅ ๊ฐ์ ๊ฒ์ฆํ๊ฒ ๋์๋ค. ์ฌ๊ธฐ์์ ์ฐธ๊ณ ํ ์ ์ ์ฐ๋ฆฌ๊ฐ ํผ์ ์ ์ถํ ๋ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ enteredName
์ํ(state)๊ฐ์ ์ด์ฉํด์ ์ ํจ์ฑ์ ๊ฒ์ฆํ๋ ๊ฒ์ด ์๋๋ผ, event.target.value
๋ฅผ ์ด์ฉํด์ผ ํ๋ค๋ ์ ์ด๋ค.const nameInputChangeHandler = (event) => {
setEnteredName(event.target.value);
if (event.target.value.trim() !== "") {
setEnteredNameIsValie(true);
}
};
nameInputChangeHandler
ํจ์์์ setEnteredName
๋ฅผ ํตํด์ ์
๋ฐ์ดํธํด์ฃผ๊ณ ์๊ธด ํ์ง๋ง ์ด์ ์ ๋ฐฐ์ ๋ ๊ฒ์ฒ๋ผ ์ด๋ฌํ ์ํ(state)๋ค์ ๋ฆฌ์กํธ์์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. setEnteredName
์์ event.target.value
๋ฅผ ํตํด์ enteredName
์ ์
๋ฐ์ดํธํ๊ณ ์์ง๋ง ๋ค์ ์ค์ด ์คํ๋ ๋์ ์ด enteredName
๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ต์ ์ ์ํ(state)๋ฅผ ๋ฐ์ํ์ง ๋ชปํ๊ณ , ์ด์ ์ ์ํ(state)๋ฅผ ์ฐธ๊ณ ํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ nameInputChangeHandler
ํจ์ ๋ด๋ถ์์ ์ํ๋ฅผ ์
๋ฐ์ดํธ ํ๋๋ฐ์ ์ฌ์ฉ๋ event.target.value
๋ฅผ ์ฌ์ฉํด์ผ๋ง ํ๋ค.enteredNameIsValid
๋ฅผ ์ฌ์ฉํ ํ์ ์๋ค.const [enteredName, setEnteredName] = useState("");
const [enteredNameIsValid, setEnteredNameIsValie] = useState(false);
const [enteredNameTouched, setEnteredNameTouched] = useState(false);
useEffect
ํจ์๋ถํฐ ์ง์์ฃผ์.// useEffect(() => {
// if (enteredNameIsValid) {
// // true ์ผ ๋
// console.log("Name Input Is valid!"); // ์ฝ์์ ์ถ๋ ฅํ๋ค
// }
// }, [enteredNameIsValid]);
enteredNameIsValid
์ํ๋ฅผ ์ ๊ฑฐํ๊ณ , ๋์ผํ ์ด๋ฆ์ ์์๋ฅผ ์ถ๊ฐํ๋ค.const [enteredName, setEnteredName] = useState("");
const [enteredNameTouched, setEnteredNameTouched] = useState(false);
const enteredNameIsValid;
enteredName
์ enteredNameTouched
์ํ๋ง ์ฌ์ฉํ๋ค. ์๋ํ๋ฉด enteredNameIsValid
๋ ์ด์จ๋ enteredName
๋ผ๋ ์ํ๋ก๋ถํฐ ์ป์ด๋ผ ์ ์๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ฉฐ, ์๋ก์ด ๊ฐ์ด ์
๋ ฅ๋ ๋๋ง๋ค ์ด ์ ์ฒด ์ปดํฌ๋ํธ๊ฐ ๋ค์ ์คํ๋๊ธฐ ๋๋ฌธ์ enteredNameIsValid
์ ๊ฐ์ ๊ฐ์ฅ ์ต์ ์ enteredName
์ ๊ฐ์ฅ ์ต์ ์ setEnteredNameTouched
์ํ๋ฅผ ๋ฐ์ํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ด์จ๋ ์ด ๋ ์ํ ์ค ํ๋๋ผ๋ ์
๋ฐ์ดํธ ๋๋ค๋ฉด, ํด๋น ์ปดํฌ๋ํธ๋ ๋ฆฌ๋ ๋๋ง ๋ ๊ฒ์ด๋ค.const [enteredName, setEnteredName] = useState("");
const [enteredNameTouched, setEnteredNameTouched] = useState(false);
const enteredNameIsValid = enteredName.trim() !== "";
enteredNameIsValid
์ ๊ฐ์๋ enteredName
์ํ ๊ฐ์ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ ๊ฐ์ด ๋น ๋ฌธ์์ด์ด ์๋ ๋ true ์ผ ์ ์๊ฒ๋ ์์ฑํด์ค๋ค. enteredNameIsValid
์ ์กฐ๊ฑด์ ๊ฐ์ด true ๋ผ๋ฉด enteredNameIsValid
๋ true์ธ ์
์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ๋์ด์ enteredNameIsValid
๋ฅผ ์ํ๋ก ๊ด๋ฆฌํด์ฃผ์ง ์๊ณ ์๊ธฐ ๋๋ฌธ์ setEnteredNameIsValid
๊ฐ ์ฌ์ฉ๋ ๋ชจ๋ ์ฝ๋๋ฅผ ์ง์ธ ์ ์๊ฒ ๋๋ค.const enteredNameIsValid = enteredName.trim() !== "";
const nameInputChangeHandler = (event) => {
setEnteredName(event.target.value);
};
const nameInputChangeHandler = (event) => {
setEnteredName(event.target.value);
if (event.target.value.trim() !== "") {
setEnteredNameIsValie(true);
}
};
nameInputBlurHandler
ํจ์๋ ์ด๋จ๊น? ์ฌ๊ธฐ์์๋ ๊ฒฐ๊ตญ์ ์ ํจ์ฑ ๊ฒ์ฆ์ด ํ์ ์์ผ๋, ์ด ๋ถ๋ถ์ ์ญ์ ํ ์ ์๊ฒ ๋๋ค.const enteredNameIsValid = enteredName.trim() !== "";
const nameInputIsInvalid = !enteredNameIsValid && enteredNameTouched;
const nameInputBlurHandler = (event) => {
setEnteredNameTouched(true);
};
enteredName
์ํ(state)๋ฅผ ํตํด์ ์ป์ enteredNameIsValid
๊ณผ ๋
ผ๋ฆฌ์ฐ์ฐ์ ํตํด ์ป์ nameInputIsInvalid
๋ฅผ ์ฌ์ฉํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.const [enteredName, setEnteredName] = useState("");
const [enteredNameTouched, setEnteredNameTouched] = useState(false);
const enteredNameIsValid = enteredName.trim() !== "";
const nameInputIsInvalid = !enteredNameIsValid && enteredNameTouched;
enteredName
์ด ์ ํจํ์ง๋ฅผ ํ์ธํ๊ณ (enteredNameIsValid
) ์ ํจํ์ง ์๋ค๋ฉด, enteredNameTouched
์ ์กฐํฉ(nameInputIsInvalid
) ํ๋ค.const formSubmitssionHandler = (event) => {
event.preventDefault();
setEnteredNameTouched(true);
if (enteredName.trim() === "") {
setEnteredNameIsValie(false);
return;
}
setEnteredNameIsValie(true);
setEnteredName("");
};
enteredNameIsValid
๋ผ๋ ์ํ(state)๋ ์ฌ๋ผ์ก๋ค. ํผ์ ์ ์ถํ๋ ํจ์์ธ formSubmitssionHandler
์ญ์ ์์ ํ ํ์๊ฐ ์์ ๊ฒ์ด๋ค. ํ์ง๋ง ์
๋ ฅ ๊ฐ์ด ์ ํจํ์ง ์์ ๋ ํด๋น ํจ์๋ฅผ ์ค๋จํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์กฐ๊ฑด๋ฌธ์ ์ ์งํด์ผ ํ๋ค. ๊ทธ๋ ๊ธฐ์ ์ ํจ์ฑ์ ๋ฐ๊ฟ์ฃผ๋ ๋์ ์ ์ฌ๋ผ์ง ์ํ ์
๋ฐ์ดํธ ๊ฐ์ธ setEnteredNameIsValie
๋ฅผ ์ฌ์ฉํ ๋ก์ง์ ๋ชจ๋ ์ง์์ฃผ๊ณ , ์กฐ๊ฑด์์ enteredNameIsValid
๊ฐ false ์ธ์ง๋ง ํ์ธํ๋ฉด ๋๋ค.const formSubmitssionHandler = (event) => {
event.preventDefault();
setEnteredNameTouched(true);
if (!enteredNameIsValid) {
return;
}
setEnteredName("");
};
enteredNameIsValid
๊ฐ false ๋ผ๋ฉด, ํด๋น ํจ์๊ฐ ์ค๋จ๋ ์ ์๋๋ก return ํด์ฃผ์๋ค. formSubmitssionHandler
ํจ์๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋ ๋๋ง๋ค ๋ค์ ์์ฑ๋๋ฉฐ, ๋ฐ๋ผ์ formSubmitssionHandler
์ ๋งค๋ฒ enteredNameIsValid
์ ์ต์ ๊ฐ์ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.const formSubmitssionHandler = (event) => {
event.preventDefault();
setEnteredNameTouched(true);
if (!enteredNameIsValid) {
return;
}
setEnteredName("");
};
formSubmitssionHandler
ํจ์๋ฅผ ๋ณด๋ฉด, ์ ํจ์ฑ ๊ฒ์ฆ์ด ๋๋ ํ๋ก ๊ทธ๋ฌ๋๊น ์ ํจ์ฑ ๊ฒ์ฆ์์ true๊ฐ ๋์์ ๋ ๊ฐ์ ์ ์ถ๋๋ฉด์ setEnteredName
๋ฅผ ํตํด ๋น ๊ฐ์ผ๋ก ์ด๊ธฐํ ํด์ฃผ์๋ค. ๊ทธ๋ฌ๋๊น ์ ํจ์ฑ ๊ฒ์ฌ์์ ๋น ๊ฐ์ผ ๋ ์๋ฌ ๋ฉ์ธ์ง๊ฐ ์ถ๋ ฅ๋๋๋ก ์ฐ๋ฆฌ๊ฐ ์ง์ ํด๋์๊ธฐ์ ๋ฐ์ํ ๋ฌธ์ ์ด๋ค.const formSubmitssionHandler = (event) => {
event.preventDefault();
setEnteredNameTouched(true);
if (!enteredNameIsValid) {
return;
}
setEnteredName("");
setEnteredNameTouched(false);
};
setEnteredNameTouched
๋ฅผ ํตํด์ ๊ฐ์ false ๋ก ์ด๊ธฐํํด์ฃผ๋ฉด ๋๋ค. setEnteredName
์ ํตํด ํผ์ด ์ ์ถ๋๊ณ ๋น ๋ฌธ์์ด์ด ๋ง๋ค์ด์ง๋ฉด, ๊ทธ ๋ค์์ ๋ฐ๋ก setEnteredNameTouched
๋ก ์ด๊ธฐํ๋ฅผ ํ๋ ๊ฒ์ด๋ค. ํผ์ด ์ ์ถ๋๊ณ ๋ ๋ค์๋ ์๋ก์ด ํผ์ผ๋ก ๋์๊ฐ์ ์ฌ์ฉ์๊ฐ ๊ฑด๋๋ฆฌ์ง ์์ ๊ฐ์ฅ ์ต์ด์ ์ํ์ ๊ฐ์ด ์๋ํด์ผ๋ง ํ๊ธฐ ๋๋ฌธ์ด๋ค.๐จ ํด๋น ํฌ์คํ ์ Udemy์ โReact ์๋ฒฝ ๊ฐ์ด๋โ ๊ฐ์๋ฅผ ๋ฒ ์ด์ค๋ก ํ ๊ธฐ๋ก์ ๋๋ค.
โ๐ป ๊ฐ์ git repo ๋ฐ๋ก๊ฐ๊ธฐ