์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- canvas js
- tanstack-query
- ์น ๋ธ๋ผ์ฐ์ ๋ ๋๋ง
- HTML ํ์ผ๊ตฌ์กฐ
- HTML
- jest
- CSS
- ๋ ธ๋ง๋ ์ฝ๋
- axios-mock-adapte
- typescript
- negative margin
- ๋ฐ๋๋ผ JS๋ก ๊ทธ๋ฆผํ ๋ง๋ค๊ธฐ
- ์ฝ์ฝ์ํก ํด๋ก ์ฝ๋ฉ
- tailwindcss
- ์ฝ๋ฉ๋ ํ
- javascript
- canvas image
- ์ํ์ฝ๋ฉ
- ์น ๋ธ๋ผ์ฐ์ ๊ตฌ์กฐ
- ๋ฐ๋๋ผ JS๋ก ํฌ๋กฌ ์ฑ ๋ง๋ค๊ธฐ
- queryprovider
- canvas
- ์ฝ๋ฉ์ผ๊ธฐ
- JS
- ํ๋ก ํธ์๋
- next.js
- JAVA Script
- ๋ ธ๋ง๋์ฝ๋
- clone coding
- react
- Today
- Total
Coding Archive
๋ ธ๋ง๋ ์ฝ๋ - ๋ฐ๋๋ผ JS๋ก ํฌ๋กฌ ์ฑ ๋ง๋ค๊ธฐ(5) ๋ณธ๋ฌธ
๋ ธ๋ง๋ ์ฝ๋ - ๋ฐ๋๋ผ JS๋ก ํฌ๋กฌ ์ฑ ๋ง๋ค๊ธฐ(5)
์ฝ๋ฑ์ด 2022. 6. 9. 17:22#4 LOGIN
0. Input Values
๋ชจ๋ ๊ฒ์ HTML์์ ์์๋์ด์ผ ํ๋ค. HTML์์ ์์ฑํ๊ณ JS๋ก ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.
- ๋จผ์ , HTML ์ฝ๋ ์์ฑํ๊ธฐ
1. ์ ์ ๊ฐ ์ด๋ฆ์ ์์ฑํ ์ ์๋๋ก input ํ๊ทธ๋ฅผ ์์ฑํ๋ค.
์์ ํ ์คํธ๋ฅผ ๋ฃ์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, type="text"ํด์ฃผ๊ณ , ์์ ๋ฏธ๋ฆฌ ์์ฑํ ๋ง์ placeholder ์์ ์จ์ค๋ค.
2. ์์ Log In ๋ฒํผ์ ๋ง๋ ๋ค.
3. divํ๊ทธ๋ก ์์ ๊ฒ๋ค ๋ฌถ์ด์ฃผ๊ณ , id="login-form"์ ์ง์ ํด์ค๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๊ทธ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ
1. html element๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋ณ์ ์์ ๋ฃ๊ณ ๊ฐ์ ธ์ค๊ธฐ
const loginInput = document.querySelector("#login-form input");
const loginButton = document.querySelector("#login-form button");
querySelector๋ก idํ๊ทธ๋ฅผ ์ธ๋๋ #๋ฅผ ์จ์ผ ํ์ง๋ง getElementById๋ก idํ๊ทธ๋ฅผ ์ธ ๋ #๋ฅผ ์ฐ์ง ์๋๋ค.
2. ๋ฒํผ์ ํด๋ฆญํ๋ฉด, onLoginBtnClickํจ์ ์คํ
loginButton.addEventListener("click, onLoginBtnClick);
3. ํจ์ ๋ง๋ค๊ธฐ
function onLoginBtnClick(){
console.log(loginInput.value); // loginInput์ value๋ฅผ ๋ณด์ฌ์ค.
}
1. Form Submission
JavaScript์์ ๊ตฌํํ๋ ๋์ ํ ์ ์๋ค๋ฉด HTML์ ๊ธฐ๋ณธ ์์ฑ์ ์ต๋ํ ์ด์ฉํ๋ ๊ฒ ์ข๋ค.
์ฌ์ฉ์๊ฐ ๋ฌด์ธ๊ฐ๋ฅผ ์ ๋ ฅํด์ผ๋ง ํ๊ณ , ๊ธ์ ์๊ฐ 15๋ฅผ ๋๊ธฐ์ง ์๋๋ก ๋ง๋ค๋ ค๊ณ ํ๋ค๋ฉด?
→
input ํ๊ทธ์ ๋ค์ํ ์์ฑ๋ค์ ์ด์ฉ, input์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์๋์ํค๊ธฐ ์ํด์๋ input์ด form ์์ ์์ด์ผ ํ๋ค.
(form์์ input์ด ์์ด์ผ ์๋ ์ฝ๋๊ฐ ์๋๋๋ค.)
<form id="login-form">
<input
required
maxlength="15"
type="text"
placeholder="What is your name?"
/>
<input type="submit" value="Log In" />
</form>
๋ฌธ์ !
๋๋ ๋ก๊ทธ์ธ์ ํ๋ฉด ์๋ก๊ณ ์นจ ํ์ง ์๊ณ , user ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์ถ์๋ฐ ์๊พธ ์๋ก๊ณ ์นจ ๋๋ค.
form์ด submit ๋๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค. input ์์ ์๋ button์ ๋๋ฅด๋ฉด ๋ด๊ฐ ์์ฑํ form์ด submit ๋๋ค.
2. Events
form์ submit ํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจ ํ๋๋ก ๋์ด์๋ค. (← ์ด๊ฑด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์ด ์๋๋ค.)
preventDefault() ํจ์๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ณธ ๋์์ ๋ง์ ์ ์๋ค!
์ด preventDefault ํจ์๋ EventListener ํจ์์ '์ฒซ ๋ฒ์งธ argument' ์์ ์๋ ํจ์์ด๋ค.
์ฒซ arument๋ ์ง๊ธ ๋ง ๋ฒ์ด์ง event๋ค์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๋ค. event ์ ๋ณด๋ฅผ ๋ด๋ object์ด๋ค.
JS๋ (๊ธฐ๋ณธ์ ์ผ๋ก) argument๋ฅผ ๋ด์์ ํจ์๋ฅผ ํธ์ถํ๋๋ฐ, ์ด argument๊ฐ ๊ธฐ๋ณธ ์ ๋ณด๋ค์ ์ ๊ณตํ๊ณ ์๋ค.
ex) ๋๊ฐ submit์ฃผ์ฒด์ธ์ง, ๋ช ์์ submit์ ํ๋์ง ๋ฑ๋ฑ console์ ์ถ๋ ฅํด๋ณด๋ฉด ์ ์ ์๋ค.
function onLoginSubmit(event) {
event.preventDefault(); // ๋ธ๋ผ์ฐ์ ๊ฐ ๊ธฐ๋ณธ ๋์์ ์คํํ์ง ๋ชปํ๊ฒ ๋ง๊ธฐ(event object๋ preventDefaultํจ์๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ๊ณ ์์)
console.log(event);
}
loginForm.addEventListener("submit", onLoginSubmit); // submit ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด, onLoginSubmitํจ์๋ฅผ ์คํ์ํจ๋ค๋ ์๋ฏธ
3. Events part Two
addEventListener ์์ ์๋ ํจ์๋ ์ง์ ์คํํ์ง ์๋๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ ์คํ์์ผ์ฃผ๊ณ , ๋ธ๋ผ์ฐ์ ์์ ํด๋น event์ ๋ํ ์ ๋ณด ์ฆ, object๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค.
addEventListener์ ํจ์์์ object์ ๋ํ ์๋ฆฌ๋ง ํ ๋นํด์ฃผ๋ฉด, ํด๋น event๊ฐ ๋ฐ์์ํจ ์ ๋ณด๋ค์ ๋ํ object๋ค์ ๋ณผ ์ ์๋ค!
์ด๋ ํด๋น event๊ฐ ๊ฐ์ง ๊ธฐ๋ณธ Default๊ฐ์ ๋ฐ์์ํค์ง ์๊ธฐ ํ๊ฒ ์ํด์ preventDefault๋ฅผ ์ด์ฉํ์ฌ ๋ง์ ์ ์๋ค!
4. Getting Username
h1์ ํ ์คํธ๋ ์จ๊ธฐ๊ณ ์ถ์ง ์์ผ๋, loginForm์ hidden์ ๋ํ์ผ๋ h1์๋ง remove๋ฅผ ํด์ค๋ค.
loginForm.classList.remove(HIDDEN_CLASSNAME);
hidden์ ๋ ๋ฒ ์ฌ์ฉํ๊ณ ์์ผ๋, const HIDDEN_CLASSNAME = “hidden”์ ์ถ๊ฐํด์ค๋ค.
const HIDDEN_CLASSNAME = "hidden";โ
์ผ๋ฐ์ ์ผ๋ก string๋ง ํฌํจ๋ ๋ณ์๋ ๋๋ฌธ์๋ก ํ๊ธฐํ๊ณ , string์ ์ ์ฅํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
"Hello " + UserName === `Hello ${UserName}`
"Hello " + username๋ฅผ ``์ด๋ผ๋ ๋ฐฑํฑ ๊ธฐํธ๋ฅผ ์ด์ฉํด `Hello ${username}` ๋ก ํํ ๊ฐ๋ฅํ๋ค!
5. Saving Username
localStorage ๋ธ๋ผ์ฐ์ ์ ๋ฌด์ธ๊ฐ๋ฅผ ์ ์ฅํ ํ ๋์ค์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
localStorage.setItem("username", username);
"username" => ์ ์ฅ๋ ์์ดํ ์ ์ด๋ฆ (DB box) → key
username => ๋ณ์ → value
localStorge์์ value ์ ์ฅ
lcoalStorage.setItem("username", "nico");
localStorge์์ value ๋ถ๋ฌ์ค๊ธฐ
lcoalStorage.getItem("username");
localStorge์์ value ์ง์ฐ๊ธฐ
lcoalStorage.removeItem("username");
6. Loading Username
๋ณธ์ธ์ด ์์ฑํ string๋ค์ ๋ฐ๋ณตํด์ ์ฌ์ฉํ๊ฒ ๋ ๊ฒฝ์ฐ ๋๋ฌธ์ ๋ณ์๋ก ์ ์ฅํด๋๋ ๊ฒ ์ข๋ค.
๋ง์ฝ ์คํ ๋ง์ด ํ๋ ธ๋ค๋ฉด ์ฝ๊ฒ ์ฐพ๊ธฐ๊ฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ธ๋ฐ(์ด๋๊ฐ ํ๋ ธ๋์ง ๋งํด์ฃผ์ง ์์),
๋ณ์์ ์คํ ๋ง์ด ํ๋ ธ๋ค๋ฉด ์ ์ ์๋ค. ์ด๋ก ์ธํด ์ค์๋ฅผ ์ค์ผ ์ ์๋ค.
๊ธฐ๋ณธ ๋ก์ง
const savedUsername = localStorage.getItem("username");
if (savedUsername === null) {
// show the form
} else {
// show the greetings
}
7. Super Recap
const loginForm = document.querySelector("#login-form");
const loginInput = document.querySelector("#login-form input");
const greeting = document.querySelector("#greeting");
const HIDDEN_CLASSNAME = "hidden";
const USERNAME_KEY = "username";
function onLoginSumit(event) {
event.preventDefault();
//4. event๊ฐ ์๋ ํ๋ ํ๋์ ๋ฉ์ถค (์๋ก๊ณ ์นจ)
loginForm.classList.add(HIDDEN_CLASSNAME);
//5. loginform์ ๋ค์ ์จ๊น
const username = loginInput.value;
//6. loginInput.value๋ฅผ username์ด๋ผ๋ ๋ณ์๋ก ์ ์ฅ
localStorage.setItem(USERNAME_KEY, username);
//7. username๊ฐ์ username์ด๋ผ๋ key์ ํจ๊ป local storage์ ์ ์ฅ
paintGreeting(username);
//8. paintGreetingํจ์ ํธ์ถ
}
function paintGreeting(username) {
/** paintGreetingํจ์๋ ํ๋์ ์ธ์๋ฅผ ๋ฐ๊ณ ์๋๋ฐ,
์ง๊ธ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ ์ ๊ฐ form์์ ์๋ input์ ์
๋ ฅํ username์ด๋ผ๋ ์ธ์๋ฅผ ๋ฐ๊ณ ์์**/
greeting.innerText = "Hello " + username; //`Hello ${username}`
//9. ๋น์ด์๋ h1์์ ์์ innerText๋ฅผ ํจ
greeting.classList.remove(HIDDEN_CLASSNAME);
//10. ๊ทธ ๋ค์์ h1 ์์๋ก๋ถํฐ hidden์ด๋ผ๋ ํด๋์ค ๋ช
์ ์ ๊ฑฐ
}
const savedUsername = localStorage.getItem(USERNAME_KEY);
//1. localStorage์์ username key๋ฅผ ์ฐพ์ผ๋ ค ํจ
if (savedUsername === null) {
loginForm.classList.remove(HIDDEN_CLASSNAME);
//2. savedUserName๊ฐ null์ด๋ผ๋ฉด loginForm์ hidden class๋ฅผ ์ ๊ฑฐ
loginForm.addEventListener("submit", onLoginSumit);
/**3. ๊ทธ ํ loginform์ addEventListener๋ฅผ ๋ํ๊ณ , submit์ ๊ธฐ๋ค๋ฆผ
submit event๊ฐ ๋ฐ์ํ๋ฉด onLoginSubmitํจ์๊ฐ ์คํ**/
} else { // 12. ์ฐฝ์ ์๋ก๊ณ ์นจ ํ๋๋ผ๋ USERNAME_KEY๊ฐ ์ง์์ง์ง ์๊ณ ,์ด๋ฏธ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ํด๋น ์กฐ๊ฑด๋ฌธ์ false๊ฐ ๋จ
paintGreeting(savedUsername);
/** 13. paintGreetingํจ์๋ก ์งํ
์ด ๊ฒฝ์ฐ์๋ paintGreeting ํจ์๊ฐ local storage์ ์ ์ฅ๋ ๊ฐ์ ์ธ์๋ก ๋ฐ๊ฒ ๋๊ณ ,
์ด ์ ์ ํ๋ ์์
์ด ๋ฐ๋ณต๋จ**/
}
์ฌ์ค paintGreetings ํจ์๋ ๋ฐ๋ก ์ธ์๋ฅผ ๋ฐ์ ํ์๊ฐ ์๋ค. (= ์๋ฌด๊ฒ๋ ๋ณด๋ด์ง ์์๋ ๋๋ค. )
์๋ํ๋ฉด ์ฐ๋ฆฌ๋ localStorage์ ์ ์ ์ ๋ณด๊ฐ ์กด์ฌํ๋ ๊ฑธ ์๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
=>
localStorage์ ๋ญ๊ฐ๋ฅผ ์ ์ฅํ๋ฉด paintGreetings๋ฅผ ํธ์ถํ๋ ์๊ฐ์, ๊ทธ ์ ์ ์ ๋ณด๋ ์ด๋ฏธ localStorage์ ์ ์ฅ๋์ด ์์ ๊ฒ์ด๋ค.
+) Q
paintGreetings(savedUsername)์ paintGreetings์ ์ธ์ ๊ฐ์ด username๊ณผ ๋ฌ๋ผ๋ ์คํ์ด ๋๋ ๊ฑด์ง?
→
function paintGreetings ์์์๋ง ์ผ์นํ๋ฉด ์ธ์ ๊ฐ์ ์ด๋ค ์ด๋ฆ์ผ๋ก ๋ถ๋ฌ๋ ์๊ด์์ด ์คํ๋๋ค.
(๊ฐ์ ๊ธฐ์ค) function์์ ์ธ์ ๊ฐ์ผ๋ก username๋ผ๋ ์ด๋ฆ์ ์ ํ๊ธฐ ๋๋ฌธ์ function ์์์๋ username์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ์ฐ๋ฉด ๋๊ณ , function ๋ฐ์์๋ paintGreetings(savedUsername)๋ก ๋ถ๋ฅด๋ ์๊ด์๋ค.
์๋ก ๋ค๋ฅธ ์ธ์ ๊ฐ ์ด๋ฆ์ผ๋ก ๋ถ๋ฌ๋ ๊ณตํต๋ถ๋ถ์ ์ด์ฉํ๊ธฐ ์ํด function์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
'๐ฅ๏ธ Clone Coding' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ ธ๋ง๋ ์ฝ๋ - ๋ฐ๋๋ผ JS๋ก ํฌ๋กฌ ์ฑ ๋ง๋ค๊ธฐ(7) (0) | 2022.06.11 |
---|---|
๋ ธ๋ง๋ ์ฝ๋ - ๋ฐ๋๋ผ JS๋ก ํฌ๋กฌ ์ฑ ๋ง๋ค๊ธฐ(6) (0) | 2022.06.10 |
๋ ธ๋ง๋ ์ฝ๋ - ์ฝ์ฝ์ํก ํด๋ก ์ฝ๋ฉ ์ฐ์ต(7) (0) | 2022.05.20 |
๋ ธ๋ง๋ ์ฝ๋ - ์ฝ์ฝ์ํก ํด๋ก ์ฝ๋ฉ ์ฐ์ต(6) (0) | 2022.05.19 |
๋ ธ๋ง๋ ์ฝ๋ - ์ฝ์ฝ์ํก ํด๋ก ์ฝ๋ฉ ์ฐ์ต(5) (0) | 2022.04.23 |