대혼란~~😱😱😱


const toDoForm = document.querySelector(".js-toDoForm"),
  toDoInput = toDoForm.querySelector("input"),
  toDoList = document.querySelector(".js-toDoList");
//html에서 가져오기


const TODOS_LS = "toDos"; //해야할일 상수 설정


/*
function filterFn(toDo) {
  //forEach에서 function 실행하는 것처럼 각각의 item과 같이 실행됨
  return toDo.id === 2;
  //filter는 array의 모든 아이템을 통해 함수를 실행하고 true인 아이템들만 가지고 새로운 array를 만듬(id 가 1일때)
}
밑에 filter() 안으로 함수 넣음. 밖으로 안빼고
*/


let toDos = []; //toDos 를 입력할 때 마다 toDos Array에 입력됨


function deleteToDo(event) {
  //ToDo 삭제 함수
  const btn = event.target; //target당한 버튼?
  const li = btn.parentNode; //btn의 부모 li 선택
  toDoList.removeChild(li); //toDoList에서 li삭제?
  //   console.log(event.target.parentNode);
  const cleanToDos = toDos.filter(function (toDo) {
    return toDo.id !== parseInt(li.id);
    //toDo id는 숫자, li id는 string 임... 초 헷갈..
    //li를 parseInt 써서 string에서 number로 변경함.
  });
  //filterFn함수에서 체크된 아이템의 array를 주는 역할
  //filterFn함수에 id===1만 있으면 id 1인 아이템만 가져온다.
  console.log(cleanToDos);
  //콘솔에 cleanToDos(새로운 array) 3개, toDos(예전 array)는 4개
  toDos = cleanToDos; //toDos let으로 정의 유의
  saveToDos(); //toDos를 저장할꺼임(즉 새로고침해도 다시 html에서 toDos 생기지 안음)
}


function saveToDos() {
  //여기 이 toDos를 가져와서 로컬(local storage)에 저장하는 역할.
  localStorage.setItem(TODOS_LS, JSON.stringify(toDos));
}
// javascript는 모든걸 string으로 저장한다. 예를들어 boolean의 true,false 저장 못 함. 그래서 JSON.stringify을 사용함.
//JSON.stringify는 자바스크립트 object를 string으로 바꿔줌
//JSON = JavaScript Object Notation
//JSON은 데이터를 전달할 때 자바스크립트가 그걸 다룰 수 있도록 object로 바꿔주는 역할
// object <--> string


function paintToDo(text) {
  //입력한 값 생성하는 함수(핵심!)
  const li = document.createElement("li"); //<li> 생성(html 입력 안하고도 생성 된다!)
  const delBtn = document.createElement("button"); //<button> 생성
  const span = document.createElement("span"); //<span> 생성
  const newId = toDos.length + 1; //newId 상수는 toDos(할일 입력한거) 총개수 + 1
  delBtn.innerText = "❌";
  delBtn.addEventListener("click", deleteToDo);
  span.innerText = text; //<span> 내용에 text 삽입
  li.appendChild(delBtn); //li 밑에 delBtn
  li.appendChild(span); //li 밑에 span
  li.id = newId; //li에도 id값 입력
  toDoList.appendChild(li); //toDoList(js-toDoList) 밑에 li
  const toDoObj = {
    //array에 입력값 넣기위한 함수.
    text: text, //text에는 text(실제입력한값) 입력
    id: newId, // id에는 newId(toDos 수량+1) 입력
    //toDos array에 왜 이런식으로 저장하냐? 그건 localstorage에도 같이 저장해줘야 하기 떄문임. 아직 뭔말인지 잘 이해안감.
  };
  toDos.push(toDoObj); //toDos Array에다가 toDoObj(입력한 값들 element)을 넣음
  saveToDos(); //입력한값 localStorage에 저장. push 다음에 와야함.
}


function handleSubmit(event) {
  //입력하는 함수
  event.preventDefault();
  const currentValue = toDoInput.value; //currentValue 상수를 입력하는 값으로 지정
  paintToDo(currentValue);
  toDoInput.value = ""; //입력 후 입력칸 값 제거하기.
}
// function something(toDo) {
//   console.log(toDo.text);
// }
// forEach 안에 함수 이렇게 분리시켜도 되긴함.


function loadToDos() {
  const loadedToDos = localStorage.getItem(TODOS_LS); //해야할일 상수 설정
  if (loadedToDos !== null) {
    // console.log(loadedToDos); //JSON.parse 하기 전(String)
    const parsedToDos = JSON.parse(loadedToDos);
    // console.log(parsedToDos); //JSON.parse 변환(element)
    parsedToDos.forEach(function (toDo) {
      paintToDo(toDo.text); //각각의 toDo 요소에 대해서 paintToDo 함수가 적용되는거지
    });
    //localstorage에 있는 내용을 자동으로 paintToDo함수 적용되게 해줌.(원래 새로고침하면 LS에는 남아있으나 화면에선 사라졌었음)

    // forEach는 기본적으로 함수를 실행하는데 array에 담겨있는 것들 각각에 한번씩 함수를 실행시켜줌.
    // 다른거처럼 만들어논 함수를 호출하는게 아니라 안에다 바로 만드는거지
    //parsedToDos array에 있는 각각의 element에 지금 만들 함수를 적용함. 그 각각을 toDo로 칭할거고.
  }
}


function init() {
  loadToDos(); //loadToDos 함수 실행
  toDoForm.addEventListener("submit", handleSubmit); //submit event실행시 handleSubmit 함수 실행
}


init();  //실행

//JSON은 javascript의 object를 string으로 바꿔준다.
//데이터를 전달할 때 javascript가 그걸 다룰 수 있도록 object를 바꿔주는 것

//filter, forEach 중요. list에 있는 모든 item을 위한 함수 실행시킴


function loadToDos() {
  const loadedToDos = localStorage.getItem(TODOS_LS); //해야할일 상수 설정
  if (loadedToDos !== null) {
    console.log(loadedToDos);  //JSON.parse 하기 전(String)
    const parsedToDos = JSON.parse(loadedToDos); (string -> element 변환)
    console.log(parsedToDos); //JSON.parse 변환(element)
  }
}
profile
개발꿈나무

0개의 댓글