본문 바로가기
코딩이야기/JS공부

[JavaScript] - To Do List 만들기②

by TaeHyeon0412 2022. 7. 19.

https://taehyeon-smilestudy.tistory.com/27?category=1020508 

 

[JavaScript] - To Do List 만들기①

ToDoList를 만들 때 꼭 되어야 하는 기능 1. 사용자가 값을 입력하고 새로고침을 했을 때 이전에 있던 값들을 불러올 수 있는가 2. 새로고침 후 사용자가 값을 입력할 때 기존에 있던 것에 덧씌워

taehyeon-smilestudy.tistory.com

 

다음은 ul의 하위 요소로 들어가는 li span button을 만들어 줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function createToDo(newToDo) {
  const li = document.createElement("li");
  li.id = newToDo.id;
//li의 id에는 submit함수에서 사용된 id를 넣어줍니다.
//(나중에 삭제하는 함수를 만들때 위치를 찾을수 있게 id값을 넣어줌)
  const span = document.createElement("span");
  const button = document.createElement("button");
  span.innerText = newToDo.text;
  button.innerText = "×";
  li.appendChild(span);
  li.appendChild(button);
//li의 자식노드로 span과 button을 추가합니다.
  todoListUl.appendChild(li);
//ul의 자식노드로 li를 추가합니다.
}
cs

 

createToDo의 매개변수 newToDo는 submitToDo의 newToDoOBJ를 받아옵니다.
li의 id에는 newToDoOBJ의 id를 받아서 오고 
span의 innerText는 newToDoOBJ의 text를 받습니다.

submitToDo함수에 createToDo와 localSaveToDos를 넣어줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
function submitToDo(submitEvent) {
  submitEvent.preventDefault();
  const inputValue = todoInput.value;
  todoInput.value = "";
  const newToDoOBJ = {
    text: inputValue,
    id: Date.now(),
  };
  toDos.push(newToDoOBJ);
  createToDo(newToDoOBJ);
  localSaveToDos();
}
cs


submit 실행문을 만들고 작동이 되는지 확인을 해봅니다.

1
todoForm.addEventListener("submit", submitToDo);
cs

 

입력한 값이 리스트로 나타나면서 작동되는 것을 확인할 수 있습니다.
하지만 새로고침을 하면 없어져 버리고 새로 입력하면 로컬스토리지에는 이전에 있던 값이 없어지고
그 위에 새로운 값이 덧씌워져 버리는데 이러한 이유는 이전에 있던 값들을 불러오지 못하고
새로운 값들만 다시 배열에 넣고 있기 때문입니다.

이것을 해결하기 위해 
로컬스토리지에 있는 키값(TODOS_KEY)을 가져오는 것을 변수로 지정하고
if 조건문을 이용하여 로컬스토리지에 키값이 있다면 그것을 불러와서 화면에 나타내 주는 함수를 만듭니다.

1
2
3
4
5
6
7
8
9
const savedToDos = localStorage.getItem(TODOS_KEY);
 
if (savedToDos !== null) {
  const parseToDos = JSON.parse(savedToDos);
  toDos = parseToDos;
  parseToDos.forEach(createToDo);
  //parseToDos를 createToDo의 매개변수로 넣고 처음부터 끝까지 돌려준다
  //parseToDos에 들어있는 배열값만큼 createToDo함수가 작동된다.
}
cs


로컬스트리지에 넣을 때 JSON.stringify를 이용해 string값으로 넣었기 때문에
불러올 때는 JSON.parse를 이용해 원래의 값(배열)으로 바꿔서 가져옵니다.

 

 

# parseToDos.forEach(createToDo);

forEach는 for문과 마찬가지로 반복적인 기능을 수행할 때 사용합니다.
  배열에 있는 각각의 아이템 실행 ex)localStorage에 저장된값이 8개면 8번실행

기본적인 사용법
 const arr = [0,1,2,3,4,5,6,7,8,9,10];

arr.forEach(function(element){
    console.log(element);               // 결과값: 0 1 2 3 4 5 6 7 8 9 10
});
// 혹은 arrow 함수 가능
arr.forEach(element => console.log(element));