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 ๊ฐ์ ๋น์๋๋ค.
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๋ฅผ ์ด์ฉํ ์ ์๋ค.

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));
}


#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 |