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

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

DAY 12

 

 

7.0 ~ 7.5 TO DO LIST

(์–‘์ด ๋งŽ์•„ DAY 12์—๋Š” 7.0~7.5, DAY 13์—๋Š” 7.6~7.8, DAY 14์—๋Š” 8.0~8.2๋กœ ๋‚˜๋ˆˆ๋‹ค.)

#7.0 Setup

 

index.html 

    <!-- todo -->
    <form id="todo-form">
      <input type="text" placeholder="Write a To Do and Press Enter" required />
    </form>
    <ul id="todo-list"></ul>

todo-form ๋‚ด์˜ input์—๋Š” ํ•  ์ผ์„ ์ž…๋ ฅ๋ฐ›๊ณ , ul ํƒœ๊ทธ์—๋Š” ์ €์žฅํ•œ text๊ฐ€ ๋‚˜์—ด๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. 

 

 

todo.js

const toDoForm = document.getElementById("todo-form");
const toDoInput = document.querySelector("#todo-form input");
// const toDoInput = toDoForm.querySelector("input"); // ์ด๋Ÿฐ ์‹์œผ๋กœ ์“ธ ์ˆ˜๋„ ์žˆ๋‹ค.
const toDoList = document.getElementById("todo-list");

function handleToDoSubmit(event){
    event.preventDefault();
    console.log(toDoInput.value);
}

toDoForm.addEventListener("submit", handleToDoSubmit);

 

toDoForm์—๋Š” #todo-form์„, toDoList๋Š” #todo-list๋ฅผ ๋ฐ›์•„์™”์œผ๋ฉฐ, todo-form์˜ inputํƒœ๊ทธ์˜ value๋ฅผ toDoInput์—์„œ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ๋”ฐ๋กœ ์„ค์ •ํ–ˆ๋‹ค.

 

ํ•  ์ผ์„ ์ž…๋ ฅ๋ฐ›์•˜๋Š”๋ฐ๋„ ์ž…๋ ฅํ–ˆ๋˜ value๊ฐ€ ๊ทธ๋Œ€๋กœ ๋‚จ์•„์žˆ์Œ.

 

๋‹ค๋งŒ ํ•  ์ผ ๋ชฉ๋ก์„ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ, ์ƒˆ๋กœ์šด ํ•  ์ผ์„ ์ž…๋ ฅ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ € value์— ์žˆ๋Š” ๊ฐ’์„ ์ง€์šฐ๊ณ  ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ผ์ด ๋ฒˆ๊ฑฐ๋กœ์šฐ๋ฏ€๋กœ value ๊ฐ’์„ ์ €์žฅํ•œ ํ›„ ๋‹ค์‹œ value ๊ฐ’์„ ๋น„์›Œ๋‘”๋‹ค.

 

handleToSubmit
function handleToDoSubmit(event){
    event.preventDefault();
    const newTodo = toDoInput.value;
    toDoInput.value = "";
}

 

 

 

#7.1 Adding ToDos 

 

์ด์ œ list์— ์ถœ๋ ฅํ•ด๋ณผ ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ul ํƒœ๊ทธ ์•ˆ์— li ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ด ๊ฐ๊ฐ์˜ newTodo๋ฅผ ๋งŒ๋“ค๊ณ ,

๊ทธ todo ์•ˆ์—๋Š” ํ•  ์ผ์˜ ๋‚ด์šฉ๊ณผ, ํ•ด๋‹น ํ•  ์ผ์„ ์‚ญ์ œํ•˜๋Š” ๋ฒ„ํŠผ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ๋‚ด์šฉ์€ span ํƒœ๊ทธ์—, ์‚ญ์ œ ๋ฒ„ํŠผ์€ button ํƒœ๊ทธ๋กœ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค. 

 

function paintToDo(newTodo){
    const li = document.createElement("li");
    const span = document.createElement("span");
    li.appendChild(span);
    span.innerText = newTodo;
    toDoList.appendChild(li);
}

function handleToDoSubmit(event){
    event.preventDefault();
    const newTodo = toDoInput.value;
    toDoInput.value = "";
    paintToDo(newTodo); // paintToDo ํ•จ์ˆ˜์— newToDo ๊ฐ’์„ ์ „์†ก
}

 

handleToDoSubmit ํ•จ์ˆ˜ ์•ˆ์— newTodo๋ฅผ ์ธ์ž๋กœ ๊ฐ€์ง€๋Š” paintToDo ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ๋‹ค. 

 

paintToDo function

document ์•ˆ์— li ํƒœ๊ทธ์™€ span ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑํ•œ ํ›„,

span ํƒœ๊ทธ๋ฅผ ์ด li ํƒœ๊ทธ์˜ ์ž์‹์œผ๋กœ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  span ํƒœ๊ทธ์˜ ๋‚ด์šฉ์—๋Š” handleToDoSubmit ํ•จ์ˆ˜์—์„œ ์ „๋‹ฌํ•œ newTodo์˜ ๊ฐ’์„ ๋„ฃ๊ณ ,

toDoList(ul ํƒœ๊ทธ)์—๋Š” li ํƒœ๊ทธ๋ฅผ ์ž์‹์œผ๋กœ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

 

 

#7.2 Deleting To Dos

 

์ด์ œ ์‚ญ์ œ ๋ฒ„ํŠผ์— ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ด๋‹ค.

 

function deleteToDo(){}

function paintToDo(newTodo){
    // todo ๋‚ด์šฉ ์ถ”๊ฐ€
    const li = document.createElement("li");
    const span = document.createElement("span");
    span.innerText = newTodo;
    // deleteํ•  ๋ฒ„ํŠผ ์ถ”๊ฐ€
    const button = document.createElement("button");
    button.innerText = "โŒ";
    button.addEventListener("click", deleteToDo);
    // li ํƒœ๊ทธ์—๊ฒŒ span, button์„ ์ž์‹์œผ๋กœ ์ถ”๊ฐ€
    li.appendChild(span);
    li.appendChild(button);
    // toDoList(ul)์—๊ฒŒ li ํƒœ๊ทธ๋ฅผ ์ž์‹์œผ๋กœ ์ถ”๊ฐ€
    toDoList.appendChild(li);
}

 

๊ทธ๋Ÿฌ๋‚˜ ์œ„์˜ ์ฝ”๋“œ์—์„œ์˜ ์‚ญ์ œ ๋ฒ„ํŠผ์€ newTodo์˜ li ํƒœ๊ทธ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ๋•Œ, ์ž„์˜์˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ๋‹ค๋ฅธ ๋ฒ„ํŠผ๊ณผ ๋™์ผํ•œ ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋  ๊ฒƒ์ด๋‹ค. 

 

์ด๋ฅผ ์œ„ํ•ด ๊ฐ๊ฐ์˜ ๋ฒ„ํŠผ์—๊ฒŒ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ ๊ฐ’์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•ด์ค€๋‹ค.

์ด ๋•Œ deleteToDo ํ•จ์ˆ˜ ์•ˆ์—์„œ console.log(event); ์ž‘์„ฑ ํ›„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ๊ฐ๊ฐ์˜ ๋ฒ„ํŠผ์˜ ์ด๋ฒคํŠธ๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด,

event๋Š” ๋งŽ์€ property๋“ค์„ ๊ฐ€์ง€๋Š”๋ฐ ์ด๊ฒƒ์€ ์œ„์˜ ์ฝ”๋“œ์—์„œ๋Š” ์–ด๋–ค ๋ฒ„ํŠผ์ด ํด๋ฆญ ๋๋Š”์ง€ ์•Œ๋ ค์ค€๋‹ค. property์ค‘ ํ•˜๋‚˜์ธ target์€ ํด๋ฆญ๋œ HTML element๋ฅผ ๋งํ•œ๋‹ค. 

์ด ๋•Œ ๊ฐ event์˜ target์„ ์ฝ˜์†”์— ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•˜๋ฉด ์‹ค์งˆ์  button์˜ innerText์—๋Š” โŒ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ <button>โŒ</button> ์ด ์ถœ๋ ฅ๋˜๊ฒ ์ง€๋งŒ, 

 

function deleteToDo(event){
    console.dir(event.target);
}

 

dir๋กœ ๋ดค์„ ๋•Œ๋Š” ๊ฐ target ๋‚ด์˜ ๋งŽ์€ property ๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, ์ด ์ค‘ ๋ถ€๋ชจ ํƒœ๊ทธ(li)์— ๊ด€๋ จ๋œ parentNode๋‚˜ parentElement๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

console.log(event.target.parentElement.innerText);

event.target.parentElement.innerText๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๊ฐ ๋ฒ„ํŠผ์˜ ํ•ด๋‹น ๋ฒ„ํŠผ์˜ ๋ถ€๋ชจ ํƒœ๊ทธ(li)์— ์žˆ๋Š” ๋ชจ๋“  innerText๋„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์•„๋ฌดํŠผ ์ด๋Ÿฐ์‹์œผ๋กœ parentElement๊ฐ€ ๊ฐ liํƒœ๊ทธ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

deleteToDo
function deleteToDo(event){
    const li = event.target.parentElement;
    li.remove();
}

 

์ด์ œ ์‚ญ์ œ ๊ธฐ๋Šฅ๋„ ์ž˜ ๊ตฌํ˜„๋˜๊ณ  ์žˆ์ง€๋งŒ ์ง€๊ธˆ๊นŒ์ง€์˜ ์ฝ”๋“œ๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•  ๋•Œ ์‚ฌ๋ผ์ง€๋ฏ€๋กœ ์ด์ œ localStorage๋ฅผ ์ด์šฉํ•  ๊ฒƒ์ด๋‹ค. 

 

 

 

#7.3 Saving To Dos

 

๋จผ์ € ๊ฐ๊ฐ์˜ newTodo๋ฅผ ๋‹ด์„ array๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•œ๋‹ค. 

const toDos = [];

 

๊ทธ๋ฆฌ๊ณ  newTodo๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์ „์—, toDos array์— newTodo๋ฅผ pushํ•˜๊ณ , ์ถœ๋ ฅํ•˜๊ณ , ์ €์žฅํ•  ๊ฒƒ์ด๋‹ค.

 

const toDos = [];

// ๋‚˜๋จธ์ง€๋Š” ์ƒ๋žต

function saveToDos(){
    localStorage.setItem("todos", toDos);
}

function handleToDoSubmit(event){
    event.preventDefault();
    const newTodo = toDoInput.value;
    toDoInput.value = "";
    toDos.push(newTodo);
    paintToDo(newTodo); // paintToDo ํ•จ์ˆ˜์— newToDo ๊ฐ’์„ ์ „์†ก
    saveToDos();
}

 

์œ„ ์ฝ”๋“œ๋Š” ์ƒˆ๋กœ๊ณ ์นจ ์‹œ localStorage์— ์ •๋ณด๋Š” ์ž˜ ๋‚จ์•„์žˆ์ง€๋งŒ, ์ถœ๋ ฅ๋˜์ง€๋„ ์•Š์„ ๋ฟ๋”๋Ÿฌ ๋งŒ์•ฝ ๋‹ค์‹œ ์ƒˆ๋กœ์šด ํ•  ์ผ์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ดˆ๊ธฐํ™”๋œ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ localStorage์— ์ €์žฅ๋œ ์ •๋ณด๋„ array๊ฐ€ ์•„๋‹Œ ๊ทธ๋ƒฅ a,b,s,c๋กœ ์ €์žฅ๋œ text์ด๋ฉฐ ๊ฒฐ๊ตญ array๋กœ ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค.

 

์ด๋ฅผ JSON.stringfy()๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ€์ˆ˜๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊ฟ”์„œ array ๊ทธ ์ž์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค๊ณ ,

๋‚˜์ค‘์— JSON.parse()๋ฅผ ์‚ฌ์šฉํ•ด ๋ฌธ์ž์—ด์„ ๋‹ค์‹œ javascript๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” array๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

saveToDos
function saveToDos(){
    localStorage.setItem("todos", JSON.stringify(toDos));
}

 

array ํ˜•์‹์œผ๋กœ ์ž˜ ์ €์žฅ๋˜๋ฉฐ, ์ฐธ๊ณ ๋กœ ์ค‘๋ณต ๋ฐ์ดํ„ฐ ์‚ฝ์ž…๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

 

#7.4 Loading To Dos part One 

 

์ด์ œ ์‹ค์ œ ๋ฆฌ์ŠคํŠธ์— ์ถœ๋ ฅํ•  ๋•Œ๋Š” JSON.parse๋ฅผ ์ด์šฉํ•ด ์‹ค์ œ javascript๊ฐ€ ๋ฐ›์•„๋“ค์ด๋Š” array ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜์‹œํ‚ค๊ณ , forEach()๋ฅผ ์ด์šฉํ•ด index์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๊ฐ๊ฐ์˜ item์— ๋Œ€ํ•ด ํ•จ์ˆ˜๋ฅผ ํ•œ๋ฒˆ์”ฉ ์‹คํ–‰ํ•ด์ค€๋‹ค.

 

์œ„์˜ ์ฝ”๋“œ๋“ค ์ค‘ addEventListener๋ฅผ ๋ณด๋ฉด ์‹ค์ œ๋กœ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ํ•จ์ˆ˜ handleOnSubmit์— event argument๋ฅผ ๊ทธ๋ƒฅ ์ œ๊ณตํ•ด์ฃผ๋Š”๋ฐ, item๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. 

 

// todos๋ผ๋Š” ๋ฌธ์ž์—ด์ด ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉ๋˜์–ด ๋”ฐ๋กœ ์ •์˜
const TODOS_KEY = "todos";
const toDos = [];

// ๋‚˜๋จธ์ง€๋Š” ์ƒ๋žต

toDoForm.addEventListener("submit", handleToDoSubmit);
const savedToDos = localStorage.getItem(TODOS_KEY);

// ๊ฐ๊ฐ์˜ array๋“ค์˜ item(parsedToDos.array.forEach์˜ ์ธ๋ฑ์Šค)์„ ์ธ์ž๋กœ ํ•œ ํ•จ์ˆ˜๊ฐ€ ๋œ๋‹ค.. 
function sayHello(item){
	console.log("this is the turn of", item);
}
// savedToDos์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด
if (savedToDos !== null) {
	// saveToDos ๋‚ด์— ๋‹ด๊ฒจ์žˆ๋˜ ๋‚ด์šฉ์„ javascript๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” array๋กœ ์ „ํ™˜ํ•œ๋‹ค.
    const parsedToDos = JSON.parse(savedToDos);
    // ๊ฐ๊ฐ์˜ array(parsedToDos)์˜ ์ธ๋ฑ์Šค๋“ค์— ๋Œ€ํ•ด sayHello๋ผ๋Š” function์„ ์‹คํ–‰ํ•œ๋‹ค.
    parsedToDos.forEach(sayHello);
    /* // ๋˜๋Š” 19๋ฒˆ์งธ row์˜ ์ฝ”๋“œ๋ฅผ sayHello์˜ ์ •์˜ ์—†์ด ์•„๋ž˜์™€ ๊ฐ™์ด ์“ธ ์ˆ˜๋„ ์žˆ๋‹ค. 
    parsedToDos.array.forEach((item) => {
        console.log("this is the turn of", item);
    });
    */
}

 

์œ„ ์ฝ”๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ..

 

์ด์ œ list์— ์ถœ๋ ฅํ•˜๋Š” ์ผ๋งŒ ๋‚จ์•˜๋‹ค.

 

 

 

#7.5 Loading To Dos part Two

 

์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ console.log๋„, item๋„ ์“ธ ํ•„์š” ์—†์ด ๊ทธ๋ƒฅ paintToDo๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

 

if (saveToDos !== null) {
  const parsedToDos = JSON.parse(saveToDos);
    parsedToDos.forEach(paintToDo);
}

 

์ด์ œ ๊ณ„์† newToDo๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ๋ฐ”๋กœ list๋กœ ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค. ๋‹ค๋งŒ ์ง€๊ธˆ๊นŒ์ง€์˜ ์ฝ”๋“œ๋กœ๋Š” ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ ๊ฒƒ๋“ค๋งŒ localStorage์— ์ €์žฅ๋˜์—ˆ๊ณ , ์ด์ „ ๊ฒƒ์€ ์—†์–ด์ ธ์žˆ๋‹ค. ์ฆ‰ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฎ์–ด์”Œ์›Œ์กŒ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. 

๊ทธ ์ด์œ ๋Š” const toDos = []; ์ด๋‹ค. application์ด ์‹œ์ž‘ ๋  ๋•Œ toDos์˜ array๊ฐ€ ํ•ญ์ƒ ๋น„์›Œ์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

์ด ๋•Œ๋ฌธ์— const๊ฐ€ ์•„๋‹Œ ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•œ let์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ , toDos์— parsedToDos๋ฅผ ๋Œ€์ž…ํ•ด ์ „์— ์žˆ๋˜ toDos๋ฅผ ๋ณต์›ํ•œ ์ƒํƒœ๋กœ toDos๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค. 

 

let toDos = [];

// ์ƒ๋žต

if (saveToDos !== null) {
  const parsedToDos = JSON.parse(saveToDos);
  toDos = parsedToDos;
  parsedToDos.forEach(paintToDo);
}

 

๋ฎ์–ด์”Œ์›Œ์ง€์ง€ ์•Š๊ณ  ์ž˜ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค!

 

์ด์ œ ๊ทธ๋ƒฅ ๋ณด์—ฌ์ง€๋Š” li ํƒœ๊ทธ๋งŒ removeํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์‹ค์ œ localStorage์—์„œ ์‚ญ์ œ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ด๋‹ค. 

 

 

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

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