[JS] Todo-List

실행결과 미리보기

실행결과 미리 보기


목표

목표

1. 할 일 클릭 시, 완료체크표시하기

2. 삭제 버튼 클릭 시, 해당할 일만 삭제

3. todo 할일 내용 localStorage에 저장/삭제하기

4. todo 할일은 객체로 저장해서 관리하기

 


코드리뷰

01

메인 화면

<body>
  <div class="container">
    <h1 class="title">TO DO LIST</h1>

    <ul class="todo-list"></ul>

    <form id="todo-form">
      <input type="text" placeholder="TO DO..." name="todo" id="todo" autocomplete="off">
      <button class="add-btn" type="submit" value="추가">추가</button>
    </form>
  </div>
</body>

 

todo main

.todo-list{
  width: 100%;
  height: 630px;
  padding: 15px 20px;

  background-color:#d1ccc0;

  overflow-y: scroll;

  display: flex;
  flex-direction: column;
  align-items: end;
}
/* 스크롤바 css */
.todo-list::-webkit-scrollbar{width: 10px;}
.todo-list::-webkit-scrollbar-thumb{background-color: #9e9696;}
.todo-list::-webkit-scrollbar-track{background-color: #d1ccc0;}
  • 스크롤바를 처음부터 표시되게 해서 스크롤바가 생성될 때 화면이 옆으로 이동되는 것을 방지함

todo li

/* 말풍선 */
ul > li{
  width: 300px;
  height: auto;
  background-color: #ffffff;
  border-radius: 10px;
  padding: 10px 20px;
  margin-bottom: 10px;
  /* 길어진 글자 줄바꿈 */
  word-break: break-all;

  list-style-type: none;
  cursor: pointer;

  position: relative;
}
ul > li::after{
  content: "";
  position: absolute;
  top: 10px;
  right: -10px;
  width: 0;
  height: 0; 
  border-bottom: 16px solid transparent;
  border-left: 16px solid rgb(255, 255, 255);
}
  •  ::after  로 todo의 마지막 말풍선꼬리를 생성했습니다.
    : 선택한 element(s) 뒤에 가상 콘텐츠 삽입

02

todo 생성

//추가 될 할일 객체 리터럴
const toBeAdded = {
  todoText: todoForm.todo.value,
  todoId: new Date().getTime(),
  todoDone: false
}
todoArr.push(toBeAdded);
  • 객체에 todo 저장
  • new Date().getTime() 으로 고유한 ID값 생성
  • 단점으로는 new Date()로 반환하는 타임스탬프는 시간 값의 또 다른 형태이므로 
    여러 사용자가 이용하는 서비스에서 동시에 ID가 생성될 경우 중복된 값이 발생할 수 있다.

03

todo 삭제

// 할일 삭제하기
function handleDeleteBtnClick(clickedId){
  //클릭된 ID에 해당되는 요소만 삭제
  //배열에서 내가 클릭한 하나만 빼고 나머지를 filtering 해서 남겨야한다
  todoArr = todoArr.filter(function(aTodo){
    console.log(`Todo: ${aTodo.todoId}`);
    console.log(`선택한 ID: ${clickedId}`);
    
    //클릭한 item이랑 달라야지 true
    return aTodo.todoId !== clickedId
  })
  displayTodo();
  saveTodos();
}

 

  • 배열에 filter로 선택한 todo item을 제외하고 나머지는 남기기

삭제 버튼

//삭제버튼
const deleteBtn = document.createElement('button');
deleteBtn.classList.add('delete-btn');
deleteBtn.title = '클릭하면 삭제됨';
deleteBtn.textContent = '❌';
todoItem.appendChild(deleteBtn);
  • 삭제버튼 생성
//삭제버튼 클릭시
deleteBtn.addEventListener('click', function(){
  handleDeleteBtnClick(aTodo.todoId);
})
  • 삭제버튼 클릭 시

04

todo 수정

.done{
  background-color: #afaeae;
  text-decoration: line-through;
  color: rgb(93, 93, 93);
}
.done::after{
  border-left: 16px solid rgb(175, 174, 174);
}
  • 완료상태의 todo style 변경
//할일 수정하기
function handleTodoItemClick(clickedId){
  todoArr = todoArr.map(function(aTodo){
    if(aTodo.todoId === clickedId){
      return {
        //기존의 aTodo내용에다가 todoDone을 반전시켜서 줘라(! False를 True를.True를 False로)
        ...aTodo, todoDone: !aTodo.todoDone
      }
    }
    else{
      return aTodo;
    }
  })
  displayTodo();
  saveTodos();
}
  • 선택한 todo item의 id를 check 해서 일치하면 todoDone 상태 변화하기
  •  ... 문법 (= spread operator = 펼침연산자)
    : ...은 [] 괄호를 제거해 주는 문법
var text = 'abcd';
console.log(...text); // a b c d

 

  • 사용하는 곳

1. Array 합치기

var a = [1,2,3];
var b = [4,5];
var c = [...a, ...b];

console.log(c); // [1,2,3,4,5]

 

2. Array 복사

var a = [1,2,3];
var b = [...a];

console.log(a); //[1,2,3]
console.log(b); //[1,2,3]

a = [1,2,3,4];

console.log(a); //[1,2,3,4]
console.log(b); //[1,2,3]

 

3. Object를 합치기거나 복사할 때

var item1 = { a : 1, b : 2 };
var item2 = { c : 3, ...item1 };
console.log(item2); // {c : 3, a : 1, b : 2}
var item1 = { a : 1, b : 2};
var item2 = { a : 3, ...item1 };
console.log(item2); //{a: 1, b: 2}

*하지만 만약 위의 코드처럼 key값이 겹쳐진다면 뒤에 오는 item1의 a가 이긴다


05

localStorage 에 save/load

//로컬스토리지에 저장
function saveTodos(){
  //배열에 객체가 저장되있으면 stringify 해줘야 저장이 된다
  const todoString = JSON.stringify(todoArr);
  localStorage.setItem('myTodos', todoString);
}
  • 배열에 객체가 저장돼있으면 stringify 해줘야 저장이 된다
//로컬스토리지에서 가져오기
function loadTodos(){
  const myTodos = localStorage.getItem('myTodos');
  if(myTodos !== null){
    //가져온 item을 parse 해서 저장하기
    todoArr = JSON.parse(myTodos);
    displayTodo();
  }
}
loadTodos();

마무리

추후 공부가 필요한 개념

1.  {,,,} 문법 공부하기

2.  document.getElementById / querySelector / querySelectorAll / getElementsByClassName 개념 다시 공부하기

3. 고유 ID 만드는 다양한 방법

 

 

'DEVELOPMENT > JavaScript' 카테고리의 다른 글

[JS] 정규표현식 (RegExp)  (0) 2024.06.21
[JS] let,const 와 var  (2) 2024.05.22
[JS] 견종 정보 페이지  (3) 2024.05.03
[JS] Random Number Game  (0) 2024.04.30
[JS] 로또 추첨  (1) 2024.04.30