• 카테고리

    질문 & 답변
  • 세부 분야

    웹 개발

  • 해결 여부

    미해결

로컬스토리지 저장하는 방법 알려주세요 ㅠㅠ

23.04.02 19:38 작성 조회수 544

0

로컬스토리지에 투두리스트 내역들을 저장하고 싶은데 콘솔/로컬스토리지에는 저장이 되는데 화면에는 새로고침해도 그냥 다 사라저버리네요 ㅠㅠ 로그인은 새로고침해도 이름이 남아있는데.. 혹시라도 코드한번보시고 도와주세요 ㅠㅠ

 

 

let loginForm = document.querySelector('#login-form');
let loginBtn = document.querySelector('#login-btn');
let loginInput = document.querySelector('#login-input');
let greeting = document.querySelector('#greeting');

let taskArea = document.querySelector('.task-area');
let inputArea = document.querySelector('.input-area');

let inputText = document.querySelector('.input-area__text');
let addBtn = document.querySelector('.input-area__btn');
let arrary = [];
let titleList = document.querySelector('.title-box');
let discription = document.querySelector('.discription');
const body = document.querySelector('body');

const images = [
  '훈이.jpg',
  '유리.jpg',
  '철수.jpeg',
  '흰둥이.jpeg',
  '부리부리3.png',
];
let randomIndex = Math.floor(Math.random() * images.length);
let container = document.querySelector('.container');

//로그인
const HIDDEN_CLASSNAME = 'hidden';
const USERNAME_KEY = 'username';
function loginHandle(event) {
  event.preventDefault();
  loginForm.classList.add(HIDDEN_CLASSNAME);
  const userName = loginInput.value;
  localStorage.setItem(USERNAME_KEY, userName);
  greeting.innerHTML = `<span style="color:blue">${userName}</span> 님이 로그인함`;
  greeting.classList.remove(HIDDEN_CLASSNAME);
  reMoveClassList();
  backImg();
}

//리무브 클래스
function reMoveClassList() {
  taskArea.classList.remove(HIDDEN_CLASSNAME);
  inputArea.classList.remove(HIDDEN_CLASSNAME);
}

const savedUserName = localStorage.getItem(USERNAME_KEY);
loginForm.addEventListener('submit', loginHandle);

if (savedUserName === null) {
  loginForm.classList.remove(HIDDEN_CLASSNAME);
  backImg();
} else {
  reMoveClassList();
  greeting.classList.remove(HIDDEN_CLASSNAME);
  greeting.innerHTML = `<span style="color:blue">${savedUserName}</span> 님이 로그인함`;
  backImg();
}

//로컬스토리지
let toDos = [];
const TODOS_KEY = 'todos';

function saveToDos() {
  localStorage.setItem(TODOS_KEY, JSON.stringify(toDos));
}

const savedToDos = localStorage.getItem(TODOS_KEY);
console.log(savedToDos);

if (savedToDos !== null) {
  const parsedToDos = JSON.parse(savedToDos);
  toDos = parsedToDos;
  parsedToDos.forEach(render);
}

//인풋
function enterBtn(event) {
  event.preventDefault();
  let obType = {
    id: Math.floor(Math.random() * 1000),
    isComplete: false,
    inputValue: inputText.value,
  };
  inputText.value = '';
  arrary.push(obType);
  render();

  toDos.push(obType.inputValue);
  console.log(toDos);
  saveToDos();
}

addBtn.addEventListener('click', enterBtn);

//랜더
function render() {
  divHTML = '';

  discription.innerHTML = `<sapn style="color:lightgreen">전체할일 :${
    arrary.length
  } <sapn style="color:red">완료할일 :${checkCount()}</span>`;

  for (let i = 0; i < arrary.length; i++) {
    if (arrary[i].isComplete == true) {
      divHTML =
        divHTML +
        ` 
        <div class="title-list">
    <div class="title-list__title">
      <h4 class="textDone">${arrary[i].inputValue}</h4>
    </div>
    <div class="title-list__btn">
      <button class="title-list__btn1" onclick="checkBtn('${arrary[i].id}')">
      <i class="fa-solid fa-face-tired"></i>
      </button>
      <button class="title-list__btn2" onclick ="deleteBtn('${arrary[i].id}')">
        <i class="fa-solid fa-trash-can hello"></i>
      </button>
    </div>
  </div>`;
    } else {
      divHTML =
        divHTML +
        `
        <div class="title-list">
    <div class="title-list__title">
      <h4>${arrary[i].inputValue}</h4>
    </div>
    <div class="title-list__btn">
      <button class="title-list__btn1" onclick="checkBtn('${arrary[i].id}')">
        <i class="fa-solid fa-check-to-slot"></i>
      </button>
      <button class="title-list__btn2" onclick ="deleteBtn('${arrary[i].id}')">
        <i class="fa-solid fa-trash-can"></i>
      </button>
    </div>
  </div>`;
    }
  }

  titleList.innerHTML = divHTML;
}

//전체할일 카운트
function checkCount() {
  let count = 0;
  for (let i = 0; i < arrary.length; i++) {
    if (arrary[i].isComplete == true) {
      count++;
    }
  }
  return count;
}

//삭제버튼
function deleteBtn(b) {
  for (let i = 0; i < arrary.length; i++) {
    if (arrary[i].id == b) {
      arrary.splice([i], 1);
      break;
    }
  }
  render();
}

//체크버튼
function checkBtn(a) {
  for (let i = 0; i < arrary.length; i++) {
    if (arrary[i].id == a) {
      arrary[i].isComplete = !arrary[i].isComplete;
      break;
    }
  }
  render();
}

//시계
let getClock = () => {
  let date = new Date(); //new라서 객체임 현재 시간을 가저옴
  const clock = document.querySelector('#clock');

  let hour = String(date.getHours()).padStart(2, '0');
  let mimute = String(date.getMinutes()).padStart(2, '0');
  let second = String(date.getSeconds()).padStart(2, '0');

  clock.innerHTML = `<span style="color:red">${hour}시 ${mimute}분 ${second}초</span>`;
};

//타이머 함수를 통해서 1초마다 시간을 받아오게 작성
setInterval(getClock, 1000);
getClock();

//배경 이미지
function backImg() {
  container.style.backgroundImage = `url(./image/${images[randomIndex]})`;
  container.style.backgroundSize = '160px';
  container.style.backgroundRepeat = 'repeat';
}

backImg();

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.05.24

안녕하세요, 인프런 AI 인턴입니다.

투두리스트 내역을 로컬스토리지에 저장하고 있으십니다. 그러나 새로고침을 해도 화면에는 저장한 내역이 유지되지 않아 곤란하신 것 같습니다. 이 문제를 해결하기 위해서는 로컬스토리지에서 불러온 데이터를 다시 화면에 렌더링해주는 작업(render)을 해주셔야 합니다.

여기서 보면, saveToDos 함수에서는 로컬스토리지에 toDos 배열을 저장하고 있습니다. 이전 내역을 불러왔다면 toDos 배열에 이전 내역이 이미 들어가 있겠죠. 그러므로 이전 내역을 렌더링(render)해주기 위해서는 parsedToDos 배열을 forEach() 함수를 사용하여 render() 함수를 각각 호출해 주시면 됩니다.

즉, 서버를 사용하지 않고 로컬스토리지를 활용하여 데이터를 저장하고 보존하는 방법이훨씬 간편하므로 로컬스토리지를 사용하시는 것이 권장됩니다. 추가로 render() 함수를 개선하여 사용자 경험(UX)을 개선하시는 것을 추천드립니다.

감사합니다.