TodoList 생성, 보여주기

나야나·2022년 6월 30일
1

우선 기본적으로 할일을 작성하는 부분을 만들었다.

 <div class="header">
      <div class="login_header">
        <form class="login_form hidden">
          // submit으로 데이터를 보내기 때문에 유효성 검사를 여기서 실행시킬 수 있음
          // required maxlength="15" 15글자 이상이 넘어가면 글이 작성되지 않는다.
          <input class="login_input" type="text" required maxlength="15" placeholder="Type your name here" />
          <input class="login_button" type="submit" value="Log In" />
        </form>
        <h1 class="hidden greeting"></h1>
      </div>
      <div class="todo_header">TODOS</div>
    </div>

      <div class="todo_main">
        <form class="todo_form">
          // required 는 text를 입력하지 않으면 입력되지 않았다고 알려줌
          <input type="text" required placeholder="Write a To Do here" />
        </form>
        <ul class="todo_list"></ul>
      </div>

HTML의 구성은 이렇다.
input으로 글을 입력하는 부분만 설정하고 글을 작성하면 작성하면 ul 밑에 li로 JS로 추가되도록 했다.

const todo = document.querySelector(".todo_form");
const todoItem = document.querySelector(".todo_form input");
const todoList = document.querySelector(".todo_list");

function todoSubmit() {
  // 리렌더링 막기
  e.preventDefault();
  // input의 value
  const todoValue = todoItem.value;
  // 입력한 뒤 input 칸 초기화
  todoItem.value = "";

  const todoYear = date.getFullYear();
  const todoMonth = date.getMonth() + 1;
  const todoDay = date.getDate();
  
  // id가 계속 추가되어 중복되는 값이 없도록 설정
  const number = id++;
    todoObj = { content: todoValue, id: number, completed: false, year: todoYear, month: todoMonth, day: todoDay };
    todos.push(todoObj);
  
  // 추가된 todo를 그리기 위한 함수
  paintTodos(todoObj);
  saveTodo();
}

todo.addEventListener("submit", todoSubmit);

처음 시작할 때 form을 이용하여 submit으로 이벤트가 발생하는 것이 아닌 enter로 이벤트를 발생시키려고 했는데 유효성검사를 html에 바로 설정할 수 있는 것이 너무 좋아보였다 ㅎㅎ 하지만 submit으로 진행하면 리렌더링이 되는 문제가 발생한다.
그래서 e.preventDefault(); 코드를 사용하여 리렌더링이 되는 것을 막아준다.
todos의 요소는 {content:"",id:"",completed:"",date:""} 이다.
content는 입력된 값을 넣어주고,
id는 todo배열에 넣은 길이에 +1이 추가된 값이고,
completed는 boolean 으로 체크박스에 체크 유무이고,
day,year,month는 켈린더가 추가됬을 때 클릭된 날짜가 있으면 일치하는 날짜의 todo를 보이게 하고 싶어서 설정했다.

function saveTodo() {
  // key : TODOS , value : todos
  localStorage.setItem(TODOS, JSON.stringify(todos));
}
const savedTodo = localStorage.getItem(TODOS);
console.log("savedTodo", savedTodo);
if (savedTodo !== null) {
  const parsedTodo = JSON.parse(savedTodo);
  console.log("parsedTodo", parsedTodo);
  todos = parsedTodo;
  console.log("todos", todos);
  console.log("newtodos", newTodos);
  parsedTodo.forEach(paintTodos);
}

todo를 저장하는 것은 localStorage를 이용하기로 했다.
localStorage는 key,value로 이루어져 있으며
set을 이용하여 값을 저장하고 key값을 이용하여 value값을 가져올 수 있다.

JSON.stringify , JSON.parse
JSON.stringify 메서드는 JavaScript 값이나 객체를 JSON 문자열로 변환한다.
=> savedTodo
JSON.parse 메서드는 JSON 문자열의 구문을 분석하고, 그 결과에서 JavaScript 값이나 객체를 생성한다.
=> parssedTodo

localStorage에 저장된 값을 paintTodos 함수에 전달하여
forEach로 보여주도록 했다.

const paintTodos = function (newTodo) {
  const li = document.createElement("li");
  li.classList.add("todo_item");
  const checkBox = document.createElement("div");
  const div = document.createElement("div");
  const button = document.createElement("button");
  checkBox.classList.add("todo_check");
  div.classList.add("todo_text");
  button.classList.add("todo_delete");

  div.innerText = newTodo.content;
  button.innerHTML = '<i class="fa-solid fa-x"></i>';

  //Delete
  button.addEventListener("click", () => todoDelete(newTodo.id));

  // Completed;
  checkBox.addEventListener("click", (e) => todoCompleted(e, newTodo.id));

  if (newTodo.completed) {
    checkBox.classList.add("checked");
    checkBox.innerHTML = '<i class="fa-solid fa-check" id="check"></i>';
    div.style.textDecoration = "line-through";
    div.style.color = "gray";
  }
  todoList.appendChild(li);
  li.appendChild(checkBox);
  li.appendChild(div);
  li.appendChild(button);
  li.setAttribute("id", newTodo.id);
  // update를 하기 전 todo를 더블클릭하여 수정할 수 있도록 변화를 주는 곳
  div.addEventListener("dblclick", (e) => todoDblclick(e));

};

매개변수를 사용하지 않을때는 화살표함수를 사용하지 않아도 되지만(방법이 없는건 아니지만 화살표함수를 쓰는게 훨씬 깔끔), 매개변수를 전달 할 때는 화살표함수를 이용하여 전달해야 한다는 사실도 알았다!!
다음시간엔 update와 delete를 작성하도록 하겠다.

profile
열심히 하는 중

0개의 댓글