인프런 커뮤니티 질문&답변

gangsugi님의 프로필 이미지
gangsugi

작성한 질문수

문법 공부 다음엔, 자바스크립트 프로젝트 101

해결되지않는 부분이 있어서 질문드려요

해결된 질문

작성

·

224

0

삭제버튼도 아이콘폰트로 바꾸고 이것저것 추가해서 해봤습니다.

근데 모든 작동이 다 잘되는데,

만약 5개의 목록이 있고 처음에 각 항목의 삭제버튼을 클릭할시에는 다 잘 되는데요,

근데 1,2개 삭제해보고 나서 새로고침을 누른 후에는 각 항목의 삭제버튼을 클릭하면 화면상에는 제대로 되는데 로컬스토리지는 무조건 다 삭제가 됩니다. delItem 부분에서는 잘못이 있는걸까요?

const form =document.querySelector('form');
const input =document.querySelector('input');
const ul = document.querySelector('ul');
const todoCount = document.querySelector('.todo-count'); 
const clearAll = document.querySelector('.clear-all'); 

let todos = []; 

const save = () => {
  localStorage.setItem('todos', JSON.stringify(todos));
};

const updateTodoCount = () => {
  todoCount.textContent = todos.length;
};

const delItem = (event) => {
  const target = event.target.parentElement;

  todos = todos.filter((todo) => todo.id !== parseInt(target.id));

  save();
  target.remove();
  
  updateTodoCount();  
};

const addItem = (todo) => {  
  if(todo.text !== ''){ 
    const li = document.createElement('li'); 
    const span =document.createElement('span');
    const icon = document.createElement('i');

    icon.classList.add('fa-solid','fa-trash-can');
    span.innerText = todo.text;
    icon.addEventListener('click',delItem);

    ul.appendChild(li);  
    li.appendChild(span);
    li.appendChild(icon); 
    li.id = todo.id; 

    updateTodoCount(); 
  }
};

const handler = (event) => {
  event.preventDefault();
  
  const todo = {
    id: Date.now(),
    text: input.value,
  };

  if((input.value) !== '') {  
    todos.push(todo);
    addItem(todo)  
    save();
    input.value = '';
  }
  
};

const init = () => {
  const userTodos = JSON.parse(localStorage.getItem('todos')); 

  if(userTodos){
    userTodos.forEach((todo) => {
      addItem(todo);
    });
    //todos = userTodos;
    todoCount.textContent = 0;  
  }
};

clearAll.addEventListener('click', () => {
  ul.innerHTML = '';
  todoCount.textContent = 0;
  todos = [];
  localStorage.removeItem('todos');
});

init();
form.addEventListener('submit',handler);

 

답변 3

0

이룸코딩님의 프로필 이미지
이룸코딩
지식공유자

다른 글에 답변 드렸습니다.
혹시 같은 문제가 있으신 분들은 해당 글을 참고해주세요!
https://www.inflearn.com/questions/1041836

0

이룸코딩님의 프로필 이미지
이룸코딩
지식공유자

안녕하세요 gangsugi님!

AI가 답변을 달아서 그런지, 제가 실수로 읽음 처리를 한 건지 ㅠㅠ 알림이 누락되어 이제야 확인했습니다. 답변이 늦어 죄송합니다. 혹시 해결 되셨을까요? 아직 해결되지 않으셨다면 html 파일을 포함하여 전체 코드를 올려주시면 확인 후 최대한 빨리 답변 업데이트 하도록 하겠습니다.

(공부하시면서 코드를 약간 수정하신 듯 하여, 정확히 답변을 드리기 위해 전체 코드가 필요합니다. 그리고 '새로고침 후 화면 상에는 제대로 되는데 로컬스토리지는 무조건 삭제가 된다'가 어떤 상황인지 조금만 더 자세히 설명 부탁드립니다!)

0

안녕하세요, 인프런 AI 인턴이에요.

delItem 함수에서는 로컬스토리지의 todos 배열에서 삭제할 대상을 제외하고 다시 저장하는 부분이 있는 것으로 보입니다. 코드를 살펴보면 todos 배열에서 삭제할 대상을 찾을 때 id 값을 비교하고 있는데, target.id 값을 정수로 변환하여 비교하고 있습니다.

여기서 주의할 점은 각 항목의 id 값이 정말로 정수인지 확인해 보아야 합니다. 예를 들어, target.id 값이 문자열이거나 비어있을 경우 비교가 정상적으로 이루어지지 않을 수 있습니다.

또한, 저장된 todos 배열을 로컬스토리지에서 불러올 때에도 JSON.parse를 이용하여 배열 형태로 가져와야 합니다.

이 외에도 미처 확인하지 못한 다른 부분이 있을 수 있으므로, 추가적인 정보가 있다면 함께 알려주세요.

gangsugi님의 프로필 이미지
gangsugi

작성한 질문수

질문하기