html + css + javascript

[바닐라 JS로 크롬 앱 만들기] Loading Username

sping2 2023. 6. 27. 15:20

local storage에 username이 존재하는지 확인하고, 만약 존재한다면 form을 표시하지 않고 바로 h1 요소가 표시되도록 하자.

 

addEventListener를 하기 전에 localStorage를 확인해야 한다.

 

localStorage에 username라는 key에 해당하는 것이 있을 때 1과 같이 key 값에 해당하는 value를 출력해준다.

그 key, value를 지운 후에 해당 명령어를 다시 실행하면 2와 같이 null을 보여준다.

이 null인지 아닌지를 코드에서 판별해서 null인 경우 우리가 이제껏 했던 걸 계속 하면 되고, null이 아닌 경우(무언가 있는 경우) 바로 h1 요소를 화면에 보여주게 하자.

 

여기서 잠깐, 'username'이라는 문자도 많이 사용하기 때문에 변수로 만들어주자.

 

지금은 form이 화면에 보인 상태에서 시작한다. 따라서 form을 display:none해줘서 숨긴 상태에서 시작해야 한다.

ㅈ자 이제 화면엔 아무것도 보이지 않는다.

코드를 완성했다!

 

하지만.. 여기도 문제가 있다. 반복되는 코드가 있다는 것이다.

  greeting.innerText = `Hello ${username}!`;
  greeting.classList.remove(HIDDEN_CLASSNAME);

위 코드를 반복하기 때문에 함수로 만드는 것이 바람직할 것이다.

 

paintGreetings라는 함수를 만들어줬고,

이 함수를 이용하는 곳에서 파라미터와 함께 함수를 호출하도록 했다.

됐다!


~전체 코드~

html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="style.css" />
    <title>Momentum</title>
  </head>
  <body>
    <!-- form, greeting 모두 숨기기 -->
    <form class="hidden" id="login-form">
      <input required maxlength="15" type="text" placeholder="What is your name?" />
      <input type="submit" value="Log in" />
    </form>
    <h1 id="greeting" class="hidden"></h1>
    <script src="app.js"></script>
  </body>
</html>

 

css

.hidden {
  display: none;
}

 

javascript

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 onLoginSubmit(event) {
  event.preventDefault();
  loginForm.classList.add(HIDDEN_CLASSNAME);
  const username = loginInput.value;
  localStorage.setItem(USERNAME_KEY, username);
  paintGreetings(username);
}

function paintGreetings(username) {
  greeting.innerText = `Hello ${username}!`; //텍스트 추가하고
  greeting.classList.remove(HIDDEN_CLASSNAME); //greeting을 보여주기
}

const savedUsername = localStorage.getItem(USERNAME_KEY);

if (savedUsername === null) {
  //저장된 username이 없으면
  loginForm.classList.remove(HIDDEN_CLASSNAME); // form을 보여주고
  loginForm.addEventListener('submit', onLoginSubmit); //이벤트 실행
} else {
  //저장된 username이 있으면
  paintGreetings(savedUsername);
}