기록하는 개발자

[VanillaJS] Google Chrome App Momentum 만들기 - 4-2. Checklist Delete 본문

Web/Javascript

[VanillaJS] Google Chrome App Momentum 만들기 - 4-2. Checklist Delete

밍맹030 2021. 8. 5. 16:22
728x90

< 구현할 화면 >

- 위 스크린샷의 왼쪽 화면에서 체크리스트의 항목을 삭제하면 오른쪽 화면의 localStorage에서도 삭제된다.

- 새로고침 실행 시 내가 삭제를 원했던 항목을 아래 스크린샷처럼

오른쪽 화면 및 localStorage 에서 모두 보이지 않도록 조치를 취한다.

< HTML >

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet", href="css/style.css">
    <title>Momentum</title>
</head>
<body>
    <!--input의 유효성 검사를 작동시키기 위해서는 form 태그를 사용해야한다.-->
    <form class="hidden" id="login-form"> 
        <input required maxlength="15" type="text" placeholder="What is your name?">
        <button>Log in</button>
    </form>

    <h2 id="clock"> 00:00:00</h2>
    <h1 class="hidden" id="greeting"></h1>
    <br>

    <form id="todo-form">
        <input required type="text" placeholder="Write a To Do and Press Enter.">
    </form>

    <!--js로 리스트를 추가할 부분-->
    <ul id="todo-list"></ul>

    <div id="quote">
        <span></span>
        <span></span>
    </div>
    
    <script src="js/greetings.js"></script>
    <script src="js/clock.js"></script>
    <script src="js/quotes.js"></script>
    <script src="js/background.js"></script>
    <script src="js/todo.js"></script>
</body>
</html>

< todo.js >

const toDoForm = document.getElementById("todo-form");
const toDoList = document.getElementById("todo-list");
const toDoInput = toDoForm.querySelector("input");

let toDos=[];
const TODOS_KEY = "todos";

function handleToDoSubmit(event){
    event.preventDefault();
    const newToDo =toDoInput.value;
    toDoInput.value="";

    const newTodoObj={ 
        text : newToDo,
        id : Date.now(),
    };

    toDos.push(newTodoObj);
    paintToDo(newTodoObj);
    saveToDos();
}

function paintToDo(newToDo){
    const li = document.createElement("li");
    li.id=newToDo.id;

    const span = document.createElement("span");
    span.innerText = newToDo.text;

    const button = document.createElement("button");
    button.innerText = "❌";

    button.addEventListener("click",deleteToDo);

    li.appendChild(span);
    li.appendChild(button);
    toDoList.appendChild(li);
}

function deleteToDo(event){
    const li =event.target.parentElement;
    li.remove();
    toDos =toDos.filter((toDo)=> toDo.id !== parseInt(li.id));
    saveToDos();
}

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

toDoForm.addEventListener("submit", handleToDoSubmit)

const savedToDos=localStorage.getItem(TODOS_KEY);

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

 

< 지난 checklist load 에서 변경된 부분 >

 

1. handleToDoSubmit 함수

function handleToDoSubmit(event){
    event.preventDefault();
    const newToDo =toDoInput.value;
    toDoInput.value="";

    const newTodoObj={ //배열에 text 대신 object를 저장
        text : newToDo,
        id : Date.now(), //random처럼 보이는 ms 반환
    };

    toDos.push(newTodoObj); //배열에 객체 push
    paintToDo(newTodoObj); //html에 객체 전달
    saveToDos();
}

- 기존 : 배열에 input으로 들어온 text만 저장한다. → string type의 배열 생성

- 변경 : 배열에 input으로 들어온 text와 Date.now() 함수를 이용한 id를 함께 저장한다.  → object type의 배열 생성

 

-paintToDo 함수에도 text인 newToDo가 아닌 text와 id가 함께 들어있는 객체 자체를 전달한다.

 

2. paintToDo 함수

function paintToDo(newToDo){
    const li = document.createElement("li");
    li.id=newToDo.id;

    const span = document.createElement("span");
    span.innerText = newToDo.text;

    const button = document.createElement("button");
    button.innerText = "❌";

    button.addEventListener("click",deleteToDo);

    li.appendChild(span);
    li.appendChild(button);
    toDoList.appendChild(li);
}

- li 태그의 id로 배열에 저장한 id를 저장한다.

- span의 innerText 에 들어갈 내용을 newToDo가 아닌 newToDo에 있는 text로 저장한다.

 

3. deleteToDo 함수

function deleteToDo(event){
    const li =event.target.parentElement;
    li.remove();
    toDos =toDos.filter((toDo)=> toDo.id !== parseInt(li.id));
    saveToDos(); .
}

- filter 함수를 사용해 새로운 배열로 만들어 기존 toDos 배열에 저장한다.

  → 단, 삭제를 원하는 li의 id와 같은 경우 해당 객체는 새로운 배열에 저장하지 않는다.
- 바뀐 배열을 localStorage에 다시 한 번 저장한다.

728x90