username이 입력된다면 다음의 동작이 실행되도록 해보자.
- username 입력 form 숨기기
- username을 반영하여 Hello 라며 인사하는 텍스트 드러내기
- 이것들을 페이지 새로고침 없이
/* style.css */ .hidden { display: none; }
html 태그에 부여해줄 용도로 .hidden 클래스의 css 코드를 정의해준다.
// app.js const loginForm = document.querySelector("#login-form"); const loginInput = document.querySelector("#login-form input"); const greeting = document.querySelector("#greeting"); // string만 포함된 변수는 대문자로 표기 // string을 저장할 때 사용 // 중요한 정보를 담지 않은 경우 const HIDDEN_CLASSNAME = "hidden"; function onLoginSubmit(event){ event.preventDefault(); // 1. 기본동작 실행(페이지 새로고침) 제거 const username = loginInput.value; loginForm.classList.add(HIDDEN_CLASSNAME); // 2. loginForm .hidden 부여 -> 안 보이게 // greeting.innerText = "Hello " + username; greeting.innerText = `Hello ${username}!`; // 3. h1의 내용으로 Hello + username 부여 greeting.classList.remove(HIDDEN_CLASSNAME); // 4. greeting .hidden 제거 -> 보이게 } loginForm.addEventListener("submit", onLoginSubmit)
코드 내용
- loginForm에 submit이 전달되면 onLoginSubmit 함수 호출
- 페이지 새로고침 없이 loginForm 안 보이게 하고 greeting(h1)에 username 변수 넣어 인사
- hidden 클래스의 넣고 뺌을 통해 보이고 안 보이게 조절
- 자주 사용하는 hidden 클래스는 변수로 저장하여 사용
참고 1 : 대문자 변수 저장
- string만 포함된 변수는 대문자로 표기
- string을 저장할 때
- 중요한 정보를 담지 않은 경우
참고 2 : string 표현
- 그동안 '+'를 사용해서 문자열을 연결
- backtick(`)을 사용하면 파이썬의 f-string처럼 변수를 반영한 string 사용 가능
- 변수의 삽입은
${var}의 형태
greeting.innerText = `Hello ${username}!`;
문제점
그런데 문제점이 있다. 새로고침할 때마다 form을 다시 입력해주어야 한다는 것.
이전 입력값을 기억하게 할 수는 없을까?
- 웹에는 IndexedDB, Web SQL, Cookies, Trust Token 등 다양한 Storage가 있다.
- 이중 Local Storage가 가장 조작이 간단
- local storage에 정보를 저장하는 방법
setItem(key, value)형태로 저장
localStorage.setItem("myCat", "Tom");
위의 예시의 경우 key는 myCat, value는 Tom
- localStorage에 저장된 정보를 사용할 때
getItem(key)형태로 사용- key에 해당하는 값을 불러오는 것
localStorage.getItem("myCat");
- localStorage에 불필요한 item 삭제
removeItem(key)형태로 사용
localStorage.removeItem("myCat");
이전 코드를 개선해보도록 하자.
가. form과 #greeting 모두 hidden 클래스 설정
<!-- index.html --> <form id="login-form" class="hidden"> <input required maxlength="15" type="text" placeholder="What is your name" > <button>Log In</button> </form> <h1 id="greeting" class="hidden"></h1>
- 둘 다 hidden으로 두고 localStorage에
usernamekey가 있는지의 여부에 따라 hidden 제거
나. localStorage에 username 있는지 여부 확인
const USERNAME_KEY = "username"; const savedUsername = localStorage.getItem(USERNAME_KEY); ... if(savedUsername === null) { // show the form loginForm.classList.remove(HIDDEN_CLASSNAME); loginForm.addEventListener("submit", onLoginSubmit) } else { // show the greeting paintGreetings(savedUsername); }
- localStorage에 USERNAME_KEY("username")의 key로 getItem
- key가 있으면 value, 없으면 null 이 savedUsername에 저장
- null이면 form을 드러내야 하고, 아니라면 username 정보로 greeting을 보여야 한다.
다. paintGreetings() 함수 정의
function paintGreetings(username){ greeting.innerText = `Hello ${username}!` greeting.classList.remove(HIDDEN_CLASSNAME); }
onLoginsubmit()함수에서도 사용하는 코드로, 중복 제거를 위해 함수화- username이 저장된 경우에만 사용
- #greeting(h1 태그)의 text로 username와 관련 text 넣음
- #greeting 태그에 hidden 클래스 제거
라. onLoginSubmit() 함수 개선
function onLoginSubmit(event){ event.preventDefault(); loginForm.classList.add(HIDDEN_CLASSNAME); const username = loginInput.value; localStorage.setItem(USERNAME_KEY, username); paintGreetings(savedUsername); }
- 자주 사용하는 string을 변수로 지정하여 교체
- string이 틀린 것은 오류 메시지로 확인이 어렵지만, 변수명이 틀린 경우 확인이 용이하기 때문
app.js 전체 코드
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"; const savedUsername = localStorage.getItem(USERNAME_KEY); function onLoginSubmit(event){ event.preventDefault(); loginForm.classList.add(HIDDEN_CLASSNAME); const username = loginInput.value; localStorage.setItem(USERNAME_KEY, username); paintGreetings(savedUsername); } function paintGreetings(username){ greeting.innerText = `Hello ${username}!` greeting.classList.remove(HIDDEN_CLASSNAME); } if(savedUsername === null) { // show the form loginForm.classList.remove(HIDDEN_CLASSNAME); loginForm.addEventListener("submit", onLoginSubmit) } else { // show the greeting paintGreetings(savedUsername); }
