๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

javascript/๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ

DAY 13

 

 

7.6 ~ 7.8 TO DO LIST

 

#7.6 Deleting To Dos part One

 

์ €๋ฒˆ ์ฝ”๋“œ์—์„œ ์‚ญ์ œ ๊ธฐ๋Šฅ์€ ์ž˜ ์‹คํ–‰๋์œผ๋‚˜, ๋ฌธ์ œ๋Š” ๊ฐ™์€ ์ด๋ฆ„์˜ ํ•ญ๋ชฉ์ด ์žˆ์„ ๋•Œ๋‹ค.

 

 

  ๋‹ค์Œ๊ณผ ๊ฐ™์ด '๋‚˜๋ฃจํ†  ๋ณด๊ธฐ'๊ฐ€ ๋‘๊ฐœ๊ฐ€ ์žˆ์„ ๋•Œ, ๋‚˜๋ฃจํ†  ๋ณด๊ธฐ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ญ์ œํ–ˆ์„ ๋•Œ ์–ด๋–ค ๊ฒƒ์„ ์‚ญ์ œํ–ˆ๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค. ๋•Œ๋ฌธ์— array์˜ ๊ฐ item์— id๋ฅผ ๋ถ€์—ฌํ•ด ๊ณ ์œ ์„ฑ์„ ๊ฐ–๊ฒŒํ•  ๊ฒƒ์ธ๋ฐ, ์ด ๊ณ ์œ ์„ฑ์€ Date.now() ํ•จ์ˆ˜๋กœ ๋ถ€์—ฌํ•  ๊ฒƒ์ด๋‹ค. 

  Date.now()๋Š” ๋ฐ€๋ฆฌ์ดˆ(1000/1์ดˆ)๋ฅผ ์ฃผ๋Š” ํ•จ์ˆ˜๋กœ, ์ด๋ฅผ ๊ฐ item์—๊ฒŒ ๊ณ ์œ ํ•œ ์•„์ด๋”” ๊ฐ’์œผ๋กœ ๋ถ€์—ฌํ•  ๊ฒƒ์ด๋‹ค. 

 

handleToDoSubmit 
function handleToDoSubmit(event) {
  event.preventDefault();
  const newTodo = toDoInput.value;
  toDoInput.value = "";
  const newToDoObj = {
    text:newTodo,
    id:Date.now(),
  }
  toDos.push(newToDoObj);
  paintToDo(newToDoObj);
  saveToDos();
}

 

๊ทธ๋ฆฌ๊ณ  paintToDo ํ•จ์ˆ˜์—๋Š” ์ด์ œ text๊ฐ€ ์•„๋‹Œ object๊ฐ€ ์‚ฝ์ž…๋˜๋ฏ€๋กœ newToDoObj ๋ผ๋Š” ์˜ค๋ธŒ์ ํŠธ ์•ˆ์˜ text๋งŒ span ํƒœ๊ทธ์•ˆ์— ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค. 

 

function paintToDo(newTodo) {
  const li = document.createElement("li");
  // ๊ฐ li์— ์ฒ˜์Œ์— Date.now()๋กœ ๋ถ€์—ฌํ•œ id ๊ฐ’์„ ์†์„ฑ์œผ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.
  li.id = newTodo.id;
  const span = document.createElement("span");
  // ์ด์ œ newToDoObj๋ผ๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋ฏ€๋กœ ๊ทธ ์ค‘ text๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
  // ์—ฌ๊ธฐ์„œ์˜ newTodo๋Š” ๋‹จ์ง€ ํ•จ์ˆ˜์˜ ์ธ์ž์ด๋ฏ€๋กœ ํ—ท๊ฐˆ๋ฆฌ์ง€ ๋ง๊ฒƒ.
  span.innerText = newTodo.text;
  const button = document.createElement("button");
  button.innerText = "โŒ";
  
  button.addEventListener("click", deleteToDo);
  
  li.appendChild(span);
  li.appendChild(button);
  toDoList.appendChild(li);
}

 

์ด์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด id ๊ฐ’์„ li ํƒœ๊ทธ์˜ property๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค!

 

 

 

#7.7 Deleting To Dos part Two  

 

  forEach์ฒ˜๋Ÿผ array์˜ ๊ฐ ์ธ๋ฑ์Šค๋“ค์—๊ฒŒ ํ•˜๋‚˜์˜ ๋™์ž‘์„ ์‹คํ–‰์‹œํ‚ค๋Š” filter ํ•จ์ˆ˜๋Š”, array์—์„œ item์„ ์ง€์šฐ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ œ์™ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  ๊ธฐ์กด์˜ array์—์„œ ์ œ์™ธํ•œ item์„ ๋บ€ ๋‚˜๋จธ์ง€ items๊ฐ€ ์žˆ๋Š” ์ƒˆ array๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰ ์„ ํƒ์˜ต์…˜์œผ๋กœ ๋ณด๋ฉด ๋œ๋‹ค.

  

  ์•„๋ž˜์˜ ์˜ˆ์‹œ๋Š” boolean์„ ์ด์šฉํ•œ ํ•จ์ˆ˜ foodFilter๋ฅผ ๋งŒ๋“ค์–ด์„œ, !== (not)์„ ํ™œ์šฉํ•ด ์‚ญ์ œํ•˜๊ณ  ์‹ถ์€ item ์™ธ์˜ ๋‚˜๋จธ์ง€ items๋ฅผ return์‹œํ‚จ๋‹ค. 

const arr = ["pizza", "chicken", "udon", "frenchFries", "pasta"];

function foodFilter(food){
	return food !== "frenchFries";
}

console.log(arr.filter(foodFilter));

 

 

 

#7.8 Deleting To Dos part Three 

 

์œ„์˜ filter ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด deleteToDo ํ•จ์ˆ˜๋ฅผ ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

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

 

filter()๋Š” forEach()์ฒ˜๋Ÿผ ๋ชจ๋“  ์ธ๋ฑ์Šค์— ํ•œํ•ด์„œ ํ•œ ๋ฒˆ์”ฉ ์‹คํ–‰์‹œํ‚ค๊ณ  ์ง€๋‚˜๊ฐ„๋‹ค๊ณ  ํ–ˆ๋‹ค.

๋•Œ๋ฌธ์— id๊ฐ€ ๋‚ด๊ฐ€ ํด๋ฆญํ•œ ๋ฒ„ํŠผ์˜ ์•„์ด๋””๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฐ’์„ ์ „๋ถ€ toDos ์•ˆ์— ๋„ฃ๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  id์˜ ๊ฐ’์€ Date.now()๋กœ ๋ฐ›์•„์˜จ number ๊ฐ’์ด๋ฏ€๋กœ ๊ฒฐ๊ตญ string ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜๋˜๊ฒŒ ๋˜๋Š” savedToDos์˜ index์™€๋Š” ๋‹ค๋ฅผ ๊ฒƒ์ด๋‹ค. ๋•Œ๋ฌธ์— parseInt๋กœ ํด๋ฆญํ•œ id ๊ฐ’์„ int๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ทธ ์ƒํƒœ์˜ toDos๋ฅผ localStorage์— ์ €์žฅํ•˜๋ฉด ๋์ด๋‹ค!

 

 


 

 

todo.js

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

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

// toDos ์ €์žฅ
function saveToDos() {
  localStorage.setItem(TODOS_KEY, JSON.stringify(toDos));
}

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

// toDos UI
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);
}

// toDos handle
function handleToDoSubmit(event) {
  event.preventDefault();
  const newTodo = toDoInput.value;
  toDoInput.value = "";
  const newToDoObj = {
    text:newTodo,
    id:Date.now(),
  }
  toDos.push(newToDoObj);
  paintToDo(newToDoObj);
  saveToDos();
}

toDoForm.addEventListener("submit", handleToDoSubmit);

// localStorage์— ์ €์žฅ๋œ ๊ฐ’์„ ์–ป์–ด์™€ savedToDos์— ์ €์žฅ
const savedToDos = localStorage.getItem(TODOS_KEY);

// savedToDos๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด
if (savedToDos !== null) {
  const parsedToDos = JSON.parse(savedToDos);
  toDos = parsedToDos;
  parsedToDos.forEach(paintToDo);
}

 

'javascript > ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

DAY 14  (0) 2023.01.09
DAY 12  (0) 2023.01.09
DAY 11  (0) 2023.01.05
DAY 10  (0) 2023.01.04
DAY 8  (0) 2023.01.03