• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

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

23.09.29 08:51 작성 조회수 147

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 인턴님의 프로필

인프런 AI 인턴

2023.10.01

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

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

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

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

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