To Do List
Momentum์ ๋ด์ฅ๋์ด ์๋ To Do List ๊ธฐ๋ฅ์ ๊ตฌํํด ๋ณด๋ ํํธ์ด๋ค.
#1. Setup
๋จผ์ ์ค๋นํด์ผ ํ ๊ฒ? ์์์ ์๋ ์์ด ๋ง์ด ํ๋ค. To do list๋ฅผ ์ ๋ ฅํ form ์์ ์์ input ์์๋ฅผ ๋ฃ์ด์ฃผ๊ณ , todo.js๋ผ๋ ์ด๋ฆ์ js ํ์ผ์ import ํด ์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์ ๋ ฅํ To do list๋ฅผ ๋ณด๊ธฐ ์ํด์๋? ๋ชฉ๋ก ํ๊ทธ๊ฐ ํ์ํ๋ค. ul ํ๊ทธ์ li ํ๊ทธ๋ฅผ ์ด์ฉํ ๊ฒ์ด๋ค. ๋์ , ul ๋ด์ ์ ๋ ฅ๋ li ํ๊ทธ๋ JavaScript๋ฅผ ํตํ์ฌ ๊ตฌํํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ul ํ๊ทธ ์์ ๋น์ ๋๋๋ก ํ๋ค.
<body>
<form id="login-form" class="hidden">
<input required
maxlength="15"
type="text"
placeholder="What is your name?" />
<input type="submit" value="Log In" />
</form>
<h2 id="clock">00:00:00</h2> <!--default ๊ฐ์ 00:00-->
<h1 id="greeting" class="hidden"></h1>
<form id=""todo-form>
<input type="text" placeholder="Write a To Do and Press Enter" required />
</form>
<ul id="todo-list"></ul>
<div id="quote">
<span></span>
<span></span>
</div>
</body>
<script src="js/greetings.js"></script>
<script src="js/clock.js"></script>
<script src="js/quotes.js"></script>
<script src="js/background.js"></script>
<script src="js/todo.js"></script>
HTML์์์ ๋ชจ๋ ์ค์ ์ด ๋๋ฌ๋ค๋ฉด todo.js๋ก ๊ฐ์ form๊ณผ ul ์์๋ฅผ const๋ก ์ ์ธํ์ฌ ๊ฐ์ ธ์จ ํ, ํจ์๋ฅผ ๋ง๋ ๋ค. ์ฌ๊ธฐ์ ์ฌ์ฉํ๋ ํจ์์ ์ด๋ฒคํธ๋ ์ฐ๋ฆฌ๊ฐ ์ ์ ๋ก๊ทธ์ธ ํผ์ ๋ง๋ค์๋ ๊ทธ ๋ถ๋ถ๊ณผ ๋งค์ฐ ํก์ฌํ๋ค. ๊ฐ์ฅ ๋จผ์ ์ํฐ๋ฅผ ๋๋ ์ ๋ ์๋ก๊ณ ์นจ์ด ๋๋ ๊ธฐ๋ณธ ๋์๋ถํฐ ์ ์ดํด ์ฃผ์.
๊ทธ ๋ค์์ผ๋ก List์ ๋จ์ผ๋ ค๋ฉด ์ ๋ ฅํ ๊ฐ์ ์ฐ๋ฆฌ๊ฐ ์์์ผ ํ๊ณ , ๊ทธ๊ฒ์ ๊ฐ์ ธ์ ํ์ฉํด์ผ ํ๋ค. ์ด๊ฒ๋ ๋ก๊ทธ์ธ ํผ์์ ๋ค ํ๋ ์์ ์ด๋ค. ์ด๋ฏธ form ์์๋ ๊ฐ์ ธ์์ผ๋, ๊ทธ form ์์ ์์ ์๋ input ์์๋ฅผ ๊ฐ์ ธ์ ์์๋ก ์ ์ธํ ํ์ ์ฝ์๋ก ์ฐ์ด ๋ณด๋ฉด ์ฝ์์์ ํ์ธ์ด ๋ ๊ฒ์ด๋ค.
const toDoForm = document.getElementById("todo-form");
const toDoInput = toDoForm.querySelector("#todo-form input");
const toDoList = document.getElementById("todo-list");
function handleTodoList(event) {
event.preventDefault();
console.log(toDoInput.value);
}
toDoForm.addEventListener("submit", handleTodoList);
๊ทธ๋ฐ๋ฐ ๋ฌธ์ ๋ ์ ๋ ฅ์ ํ์ ๋, ์ ๋ ฅ์ฐฝ์์ ์ ์ ์ ๋ ฅํ ๋ด์ฉ์ด ์ง์์ง์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด ํญ์ ๋ ์ถ๊ฐํ ๋ ๊ทธ ๋ด์ฉ์ ์ง์ฐ๊ณ ๋ค์ ์์ฑํด์ผํ๋ ๋ถ์์ฌ๊ฐ ๋ฐ์ํ๋ค.
์ด ์์ ์ ์ํด์๋ input ์์์ ์ ๋ ฅํ ๋ด์ฉ์ ์ ์ฅํ ํ, input ์์์ value๋ฅผ ๋น ๊ฐ์ผ๋ก ๋ฃ์ด ์ฃผ์ด์ผ ํ๋ค.
์ฌ๊ธฐ์ ๋ช ์ฌํด์ผ ํ ์ ์ input ์์์ value๋ฅผ ๋น์ ๋ค๊ณ ํด์ newTodo๊ฐ ๋น์์ง๋ ๊ฒ์ ์๋๋ค. ์ฐ๋ฆฌ๋ newTodo๋ผ๋ ์๋ก์ด ๋ณ์์ ์ด๋ฏธ ๋ด์ฉ์ ๋ณต์ฌํด ๋์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ console.log์๋ ์ถ๋ ฅ์ด ๋ ์ ์๋ ๊ฒ์ด๋ค. ์ด๋ฏธ ๋ณต์ฌ๋ฅผ ํ ํ์ ๋น ๊ฐ์ผ๋ก ์ฃผ๋ ์์ ์ด๋ฏ๋ก ์ด๋ฏธ ๋ณต์ฌ๋ ๋ณ์์๊ฒ๋ ์๋ฌด๋ฐ ์ํฅ๋ ๊ฐ์ง ์๋๋ค.
function handleTodoList(event) {
event.preventDefault();
const newTodo = toDoInput.value;
toDoInput.value = "";
console.log(newTodo);
}
#2. To Do List ์ถ๊ฐ
์ผ๋จ, List ์์๋ฅผ ์ถ๊ฐํ๋ ๋์์ ํด ์ค ํจ์๋ฅผ ์ถ๊ฐํ์. ์ด ํจ์๋ ๋จผ์ ๋ง๋ค์๋ ํจ์ ์์ ์์ฑํด ์ฃผ๊ฒ ๋๋ค. ์ด์ ๋ submit์ด ๋์ํ ๋ ๋์ํ๋ ํจ์ ๋ด์์ ์ด ํจ์๋ฅผ ์ฌ์ฉํด ๋์ํ๋๋ก ํด ์ค ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋จผ์ ์ ์ธ์ ํด ์ฃผ๋ ๊ฒ์ด๋ค.
๊ทธ๋ผ ์ด์ li ์์๋ฅผ ๋ง๋๋ ์ฝ๋๋ฅผ ์ง ๋ณด์. ์ ์ ํ๋ ๊ฒ์ฒ๋ผ createElement๋ฅผ ์ฌ์ฉํ์ฌ li์ span์ ๋ง๋ค์ด ์ค๋ค. span์ ์ ๋ง๋ค์ด ์ฃผ๋๋? li ์์ ํ ์คํธ์ ๋ฒํผ ๋ชจ๋๊ฐ ๋ค์ด๊ฐ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋์ค์ To Do List์ ํญ๋ชฉ์ ์ญ์ ํ๋ ๋ฒํผ์ด ํ์ํ๋ฏ๋ก ๋ง์ด๋ค.
๊ฐ๊ฐ ๋ง๋ค์ด ์ฃผ์๋๋ฐ, ์ฌ๊ธฐ์ ๋ฌธ์ ๋? span์ด li ์์ ์์ผ๋ก ๋ค์ด๊ฐ์ผ ํ๋๋ฐ ์ง๊ธ์ ๋ ๋ฆฝ๋์ด ์๋ค. ์ฌ๊ธฐ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ ์ ๋ฐฐ์ ๋ ๊ฒ์ฒ๋ผ appendChild๋ฅผ ์ฌ์ฉํ๋ค. ๊ทธ๋ผ ๊น๋ํ๊ฒ ์์๊ฐ ์์ฑํ๋ ๊ฒ์ console.log๋ก ์ถ๋ ฅํด ๋ณผ ์ ์์ ๊ฒ์ด๋ค.
function paintToDo(newTodo) {
const li = document.createElement("li");
const span = document.createElement("span");;
li.appendChild(span);
span.innerText = newTodo;
console.log(li);
}
function handleTodoList(event) {
event.preventDefault();
const newTodo = toDoInput.value;
toDoInput.value = "";
paintToDo(newTodo);
}
์ด์ ํด์ผ ํ๋ ์ผ์ ์๋ก์ด li ์์๋ฅผ ul ์์ ์์ ์ถ๊ฐํด ์ฃผ๋ ์ผ์ด๋ค. ์ด๊ฒ๋ ๊ฐ๋จํ๊ฒ appendChild๋ก ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค. ํ์ธํด ๋ณด๋ฉด, ๋.
function paintToDo(newTodo) {
const li = document.createElement("li");
const span = document.createElement("span");;
li.appendChild(span);
span.innerText = newTodo;
toDoList.appendChild(li);
}
#3. To Do List ์ญ์
์์์ ๋งํ ๊ฒ์ฒ๋ผ ๊ฐ๊ฐ์ ํญ๋ชฉ์๋ ํด๋น ํญ๋ชฉ์ ์ญ์ ํ๋ ๋ฒํผ์ด ํ์ํ๋ค. ์ผ๋จ, ๋ฒํผ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํ๋ค. ์์์ span ์์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ฒ๋ผ ๊ทธ๋๋ก ์ฝ๋๋ฅผ ์์ฑํด ์ฃผ๋ฉด ๊ทธ๋ง.
function paintToDo(newTodo) {
const li = document.createElement("li");
const span = document.createElement("span");
const button = document.createElement("button");
button.innerText = "โ";
li.appendChild(span);
li.appendChild(button);
span.innerText = newTodo;
toDoList.appendChild(li);
}
๋ฒํผ์ ์์ฑํด ์ฃผ์๋ค๋ฉด, ์ด์ ์ด ๋ฒํผ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ง ํด ์ฃผ๋ฉด ๋์ด๋ค. ๋งค์ฐ ๊ฐ๋จํ๋ค. ์ ์ผ ๋จผ์ , ์ด๋ฒคํธ๊ฐ ๋์ํ ๋ ๋ถ๋ฌ์ฌ ํจ์๋ฅผ ๋ง๋ค์ด ์ฃผ์ด์ผ ํ๋ค. ๋ฆฌ์คํธ๋ฅผ ์ถ๊ฐํ๋ ํจ์ ๋ด์์ ์ฌ์ฉ๋๋ฏ๋ก ๊ทธ ์์ ์ ์ธํด ์ฃผ๋ ๊ฒ์ด ์ข์ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ button์ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํด ์ฃผ๋ฉด ๋. ํจ์์ ์ญ์ ๋๋ ์ฝ๋๋ง ์์ฑํ๋ฉด ์๋ฃ๋ค.
function deleteTodo() {
};
function paintToDo(newTodo) {
const li = document.createElement("li");
const span = document.createElement("span");
span.innerText = newTodo;
const button = document.createElement("button");
button.innerText = "โ";
button.addEventListener("click", deleteTodo);
li.appendChild(span);
li.appendChild(button);
toDoList.appendChild(li);
}
๋ง์ ๋ฒํผ๋ค ์ค์์ ์ฐ๋ฆฌ๋ ํด๋ฆญ๋ ๋ฒํผ์ด ํฌํจ๋์ด ์๋ li ์์๋ฅผ ์ญ์ ํด์ผ ํ๋ค. ์ ์ ๋ฐฐ์ด ๊ฒ ์ค์ click์ ๋ํ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๋ค. deleteTodo ํจ์์ console.log(event)๋ฅผ ์์ฑํ์ฌ ์ถ๋ ฅํด ๋ณด์.
์ฝ์์ ๋ง์ ์ ๋ณด๋ค์ด ์ฐํ๋์ค๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ, ์ฐ๋ฆฌ๋ ์ด ์ค์ path๋ผ๋ ๊ฒ์ ํ์ธํ๋ฉด ๋๋ค.
path๋ฅผ ํผ์ณ li๋ผ๋ ์์์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด ์ด๋ค li ์์์ ๋ฒํผ์ด ํด๋ฆญ๋์๋์ง ํ์ธํ ์ ์๋ค.
์ด๊ฑด ํด๋ฆญ์ target์ด ๋ฌด์์ธ์ง ์๋ฏธํ๋ ๊ฒ์ด๊ธฐ๋ ํ๋ฐ, target์ ์กฐ๊ธ ๋ ๋ด๋ฆฌ๋ฉด ํ์ธํ ์ ์๋ค.
console.log(event.target)์ ์ฐ์ด ๋ณด๋ฉด target์ ์ฌ์ง๊ณผ ๊ฐ์ด ์ถ๋ ฅํ ์๋ ์๋ค.
๋ ์์ธํ ์ด target์ ํ์ธํ๊ณ ์ถ๋ค๋ฉด console.dir(event.target)์ผ๋ก ์ถ๋ ฅํ๋ฉด ๋๋ค. ์ด ์ค์ ์ฐ๋ฆฌ๊ฐ ์ง์คํด์ผ ํ ๊ฒ์ parent์ธ๋ฐ, ์ด๋ค ๋ถ๋ชจ ์์์ ์์ ์์์ธ์ง ํ์ธ์ด ๊ฐ๋ฅํ๋ค. ์๋ ์ฌ์ง์ ํ์ธํ๋ฉด li ์์๊ฐ ๋ถ๋ชจ ์์๋ก ์ถ๋ ฅ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ์ง์์ผ ํ ๋์์ ์ฐพ์ ์ ์๋ค. event.target.parentElement์ด๋ค. ์ด ์์๋ฅผ ์๋ก์ด ์์๋ก ์ ์ธํด ์ค ํ, ์ด ๋์์ ์ญ์ ํ๋ฉด ๋๋ค.
function deleteTodo(event) {
const li = event.target.parentElement;
li.remove();
};
#4. To Do List ์ ์ฅ
ํ์ฌ, ์ ๋ ฅ๋ To do list๊ฐ ํ๋ฉด์ ๋ํ๋๊ธด ํ์ง๋ง ์๋ก๊ณ ์นจ์ ํ๊ฒ ๋๋ฉด reset์ด ๋์ด ์ญ์ ๋์ด๋ฒ๋ฆฐ๋ค. ์ฐ๋ฆฌ๋ ์ด To do list๋ฅผ ์ ์ฅํด์ผ ํ๋ค. ์ ์ ํ๋ ๋ก๊ทธ์ธ ํผ์์ ์ด๋ฆ์ ์ ์ฅํ๋ ๋ฐฉ์์ ์ฌ์ฉํด ๋ณด์. localStorage๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฅํ๊ณ , ์ ์ฅํ ๋ด์ฉ๋ค์ ๋ถ๋ฌ์ค๋ ๊ฒ์ด๋ค.
๋จผ์ , To Do list๋ค์ด ์ ์ฅ๋ ๋น ๋ฐฐ์ด์ ๋ง๋ค์ด ์ค๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋น ๋ฐฐ์ด์ ์ ์ฅ๋๋๋ก ํด ์ฃผ์. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์๋๊ตฌ ์ฝ์์์ ํ์ธํ๋ฉด, ๋ฐฐ์ด์ ์์ฑํ To Do list ๋ด์ฉ๋ค์ด ์ ์ฅ๋ ๊ฒ์ ํ์ธํ ์ ์์ ๊ฒ์ด๋ค.
const toDos = [];
.
.
.
function handleTodoList(event) {
event.preventDefault();
const newTodo = toDoInput.value;
toDoInput.value = "";
toDos.push(newTodo);
paintToDo(newTodo);
}
์ด์ toDos๋ผ๋ ๋ฐฐ์ด์ localStorage์ ์ ์ฅํด์ผ ํ๋ค. ๊ทธ๋ฌ๋, ์์ฝ๊ฒ๋ localStorage์๋ ๋ฐฐ์ด์ ์ ์ฅํ ์ ์๋ค.
localStorage์ ์ ์ฅ์ ํ๊ฒ ํด ์ฃผ๋ ํจ์๋ฅผ ํ๋ ๋ง๋ค์ด ์ค ํ, ์ด๋ฒคํธ๊ฐ ์คํ๋๋ ํจ์์ saveToDos ํจ์๋ฅผ ์ฆ์ ์คํ์์ผ ์ค๋ค. ๊ทธ๋ผ ์ด์ localStorage์ ํ ์คํธ๋ก ์ ์ฅ๋๋ ๋ชจ์ต์ ํ์ธํ ์ ์์ ๊ฒ์ด๋ค. ์ฌ์ง์ด ์ถ๊ฐ์ ์ผ๋ก ์ ๋ ฅํ๋ฉด ์ถ๊ฐ๊ฐ ๋๊ธฐ๋ ํ๋ค. ๊ทธ๋ฌ๋, ์ฌ์ ํ ์๋ก๊ณ ์นจ์ ํ๋ฉด ํ๋ฉด์์ ์ญ์ ๋๋ฉฐ, ์ญ์ ๋ฒํผ์ ๋๋ฅธ๋ค๊ณ ์ญ์ ๊ฐ ๋์ง ์๋๋ค.
function saveToDos(){
localStorage.setItem("todos", toDos);
};
.
.
.
function handleTodoList(event) {
.
.
.
saveToDos();
}
๊ทธ๋ฆฌ๊ณ ์์์ ๋งํ๋ฏ์ด ๋ฐฐ์ด์ด ์๋ ํ ์คํธ๋ก ์ ์ฅ์ด ๋์๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฑธ ๋ฐฐ์ด๋ก ์ฌ์ฉํด์ผ ํ๋๋ฐ, ํ ์คํธ๋ก ์ ์ฅ์ด ๋๋ฉด ๊ฝค ๋ง์ด ๊ณค๋ํด์ง๋ค...... ์ด๊ฑด ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ฅ ์ค ํ๋์ธ๋ฐ, ์ ์ฅํ๊ธฐ ์ํด ์๋์ผ๋ก ๋ฐฐ์ด์ ํ ์คํธ๋ก ๋ณํํ ๊ฒ์ด๋ค.
JSON.stringify() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ๋ณด์. ์ด ๋ฉ์๋๋ JavaScript์ value๋ object ๋ฑ์ JSON ๋ฌธ์์ด๋ก ๋ณํํด ์ฃผ๋ ์ญํ ์ ํ๋ค.
๊ฐ๋จํ๊ฒ, toDos๋ฅผ ์ด ๋ฉ์๋๋ก ๊ฐ์ธ์ฃผ๊ฒ ๋๋ฉด ๋ฐฐ์ด์ ๋ชจ์ต์ผ๋ก ์ ์ฅ๋๋ ๋ชจ์ต์ ํ์ธํ ์ ์์ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋, ์ด๊ฑด ์ค์ ๋ฐฐ์ด์ด ์๋๋ค. ๋ฐฐ์ด ๋ชจ์์ ํ ์คํธ์ผ ๋ฟ.
function saveToDos(){
localStorage.setItem("todos", JSON.stringify(toDos));
};
#5. ์ ์ฅ๋ To Do List ๋ถ๋ฌ์ค๊ธฐ
To Do list๋ค์ด localStorage์ ์ ์ฅ์ ๋์ง๋ง, ์์ง๋ ์๋ก๊ณ ์นจ์ ํ๋ฉด ์ฆ๋ฐ๋๋ ํ์์ด ๋จ์์๋ค. ์ด๋ฒ ๋จ๊ณ์์๋ ์ด ๋ถ๋ถ์ ๊ณ ์ณ๋ณผ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ๊ฐ ์์์ ์ฌ์ฉํ๋ JSON.stringify() ๋ฉ์๋๋ JSON ๋ฌธ์์ด๋ก ๋ฐ๊ฟ ์ฃผ๋ ๋ฉ์๋์๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก JSON.parse() ๋ฉ์๋๊ฐ ์๋๋ฐ, stringify์ ๋ฐ๋๋ก ๋ฌธ์์ด์ ๊ฐ์ฒด๋ก ๋ณํํด ์ฃผ๋ ์ญํ ์ ํ๋ค.
์๋ ์ฌ์ง์์ ๋ณผ ์ ์๋ฏ์ด, object๋ก ๋ฐ์ดํฐ ํ์ ์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ฐ๋ฆฌ๊ฐ ์ ๊ตณ์ด ๋ฐฐ์ด ๋ชจ์์ผ๋ก ๋ ํ ์คํธ๋ฅผ ๋ฐฐ์ด๋ก ๋ณํํด ์ฃผ๋๋? ์ฒซ ๋ฒ์งธ, localStorage์ ์ ์ฅ์ ํด์ผ ํ๋๋ฐ ์ ์ฅ์ ํ ์คํธ๋ง ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ฌธ์์ด๋ก ์ ์ฅ์ ํด ์ค๋ค. ๋ ๋ฒ์งธ, ์ ์ฅ์ ํ ๋ ๋ฐฐ์ด๋ก ์ฌ์ฉํ ์์ ์ด๋ฏ๋ก ๋ฐฐ์ด์ ๋ชจ์์ ํ ๋ฌธ์์ด๋ก ์ ์ฅํ๊ธฐ ์ํด JSON.stringify() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ JSON ๋ฌธ์์ด๋ก ์ ์ฅํด ์ค๋ค. ์ธ ๋ฒ์งธ, ์ค์ ๋ก ๋ฐฐ์ด๋ก ์ฌ์ฉํด์ผ ํ๋ฏ๋ก ๊ฐ์ฒด๋ก ๋ณํํด ์ฃผ๊ธฐ ์ํด JSON.parse() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ ๊ฒ ์ ๋ฆฌํ ์ ์๊ฒ ๋ค.
์ด์ ์ด JSON.parse()๋ฅผ ์ฐ๋ฆฌ ์ฝ๋์ ํ์ฉ์์ผ ๋ณด๋ฉด, ์ฐ๋ฆฌ๊ฐ ๋ฌธ์์ด๋ก ์ ์ฅํ ์์๋ค์ ๋ฐฐ์ด๋ก ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
const TODOS_KEY = "todos";
.
.
.
const savedToDos = localStorage.getItem(TODOS_KEY);
if(savedToDos !== null) {
const pasedToDos = JSON.parse(savedToDos);
}
์ด๋ฒ์ forEach()๋ผ๋ ๋ฉ์๋์ ๋ํด์ ์์ ๋ณด์. ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด์ ์ฌ์ฉํ ๋, ๋ฐฐ์ด ์์ ์๋ ํ๋์ ์์๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ๊ฒ์ด๋ค. ๊ทธ๋ ์ฌ์ฉํ๋ ๊ฒ์ด forEach() ๋ฉ์๋์ด๋ค. ์ฃผ์ด์ง ํจ์๋ฅผ ๋ฐฐ์ด ์์ ๊ฐ๊ฐ์ ๋ํด ์คํํ๊ฒ ๋ง๋ค ์ ์๋ค. ํ ์คํธ๋ก, sayHello๋ผ๋ ํจ์๋ฅผ forEach() ๋ฉ์๋๋ก ์คํ์์ผ ๋ณด๋ฉด, ๋ฐฐ์ด์ ๊ฐฏ์๋ง๋ค ์คํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
function sayHello() {
console.log("Hello");
}
.
.
.
if(savedToDos !== null) {
const pasedToDos = JSON.parse(savedToDos);
pasedToDos.forEach(sayHello);
}
๊ทธ๋ฌ๋, ์ด๋ค ์์ดํ ์ ๋ํด ์คํ๋๊ณ ์๋์ง๋ ์ ์ ์๋ค. ๋ฌด์์ธ์ง ํ์ธํ๊ธฐ ์ํด console.log๋ก ์ถ๋ ฅํด ๋ณด์.
๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์๋ ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
function sayHello(item) {
console.log("์ด๊ฒ์", item);
}
=
if(savedToDos !== null) {
const pasedToDos = JSON.parse(savedToDos);
pasedToDos.forEach(item => console.log("์ด๊ฒ์", item));
}
๊ทธ๋ผ ์ด์ ์ ์ฅ๋ ๋ฐฐ์ด ์์๋ฅผ ํ๋ฉด์ ๋์ธ ์ ์๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ ํ๋ฉด์ To Do List๋ฅผ ๋์ฐ๋ ํจ์๋ฅผ ๋ง๋ค์ด ๋์๊ธฐ ๋๋ฌธ์ ๊ทธ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
if(savedToDos !== null) {
const parsedToDos = JSON.parse(savedToDos);
parsedToDos.forEach(paintToDo);
}
ํ์ง๋ง, ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์. ์๋ก ๋ฆฌ์คํธ๋ฅผ ์ถ๊ฐํ๋ฉด ๋ฆฌ์ ๋๊ณ ์ถ๊ฐ๋ ๊ฒ๋ค๋ง ์ ์ฅ์ด ๋๋ค. ์ผ๋ช , ๋ฎ์ด์ฐ๊ธฐ๊ฐ ๋๋ ๊ฒ์ด๋ค. ์ด ๋ฌธ์ ๋ toDos๋ผ๋ ๋ฐฐ์ด์ด ํญ์ ๋น์ด์๊ณ , ์๋ก์ด ์์๋ค๋ง ๋ฐฐ์ด์ ์ถ๊ฐ๋์ด localStorage์ ์ ์ฅ๋๊ฒ ๋ง๋ค์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์ ์ด๋ค. ์ด ๋ฌธ์ ๋ ๊ฐ๋จํ๊ฒ ํด๊ฒฐ์ด ๊ฐ๋ฅํ๋ค.
๋น ๋ฐฐ์ด์ธ toDos์ parsedToDos๋ฅผ ๋ฃ์ด ์ ์ ์๋ ๋ฆฌ์คํธ ํญ๋ชฉ๋ค์ ๋ณต์ํ๋ฉด ๋๋๋ฐ, const๋ก ์ ์ธํ๋ toDos๋ฅผ let์ผ๋ก ๋ณ๊ฒฝํด ์ฃผ๋ ๊ฒ์ ์์ผ๋ฉด ์ ๋๋ค.
์ด๋ ๊ฒ ๋๋ฉด, ์ด์ ์๋ก์ด ๋น ๋ฐฐ์ด์์ ์์ํ๋ ๊ฒ์ด ์๋, ์ ์ ์ ์ฅํ ๋ฐฐ์ด์ ๊ฐ๊ณ ์์ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ฎ์ด์ฐ๊ธฐ๊ฐ ๋๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค.
let toDos = [];
.
.
.
if(savedToDos !== null) {
const parsedToDos = JSON.parse(savedToDos);
toDos = parsedToDos;
parsedToDos.forEach(paintToDo);
}
#6. ์ ์ฅ๋ To Do List ์ง์ฐ๊ธฐ
์ ์ฅ๊น์ง๋ ๋์ง๋ง, ์์ง ๋๊ด์ด ํ๋ ๋จ์๋ค. ์ญ์ ๋ฅผ ํด๋ ํ๋ฉด์์๋ง ์ญ์ ๊ฐ ๋ ๋ฟ, localStorage์์๋ ์ง์์ง์ง ์์ ์๋ก๊ณ ์นจ์ ํ๋ฉด ์ญ์ ํ๋ ํญ๋ชฉ์ด ๋ค์ ๋ํ๋๊ฒ ๋๋ค.
ํ๋ฉด์ ๋ฆฌ์คํธ๋ฅผ ์ญ์ ํ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก target์ ์ค์ ํ์ฌ ์ญ์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํ๋ค. ์ง์ฐ๋ ค๊ณ ํ๋ ํญ๋ชฉ์ด ์๋ ๋ค๋ฅธ ํญ๋ชฉ์ด ์ง์์ง๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด์์ด๋ค. ๊ทธ๋ฌ๊ธฐ ์ํด์ ์ฐ๋ฆฌ๋ ๋ฐฐ์ด์ ์์์๊ฒ ๋๋คํ ์ซ์์ ID๋ฅผ ๋ถ์ฌํ๊ณ , ์ด ID๊ฐ target์ด ๋ ๊ฒ์ด๋ค. ๋๋คํ ์ซ์์ ID๋ Date.now()๋ฅผ ํตํ์ฌ ํ์ฌ ๋ ์ง์ ์๊ฐ์ผ๋ก ๋ฃ์ด ์ฃผ๋ฉฐ, text๋ input์ ์์ฑ๋ ๋ด์ฉ์ผ๋ก ๋๋ฉด ๋๋ค.
function handleTodoList(event) {
event.preventDefault();
const newTodo = toDoInput.value;
toDoInput.value = "";
const newTodoObj = {
text:newTodo,
id: Date.now()
}
toDos.push(newTodoObj);
paintToDo(newTodo);
saveToDos();
}
์ด์ ์ฐ๋ฆฌ๋ ๊ฐ ๋ฐฐ์ด์ ํญ๋ชฉ์ ID๋ฅผ ๋ถ์ฌํ ์ ์๊ฒ ๋์๋ค. ๊ทธ๋ ๋ค๋ฉด? ์ด์ ๋ถ์ฌํ ID๋ฅผ ์ฌ์ฉํ ์ฐจ๋ก. ์ด ID๋ฅผ HTML์ ์ฝ์ ์์ผ ์ฃผ์. ํ๋ฉด์ ๋ํ๋ด ์ฃผ๋ paintToDo ํจ์์ newTodoObj๋ฅผ ๋ฃ์ด์ฃผ๊ฒ ๋๋ฉด, ํ ์คํธ๊ฐ ๋ํ๋์ง ์๊ณ [object Object]๋ผ๋ ํ๋ฉด์ด ๋จ๊ฒ ๋๋ค. text๊ฐ ์๋ object๋ฅผ ๊ฐ์ ธ์๊ธฐ ๋๋ฌธ์ธ๋ฐ, ์ฌ๊ธฐ์ newTodo์ text๋ฅผ ๊ฐ์ ธ์ค๋ฉด ์๋ฃ. id๋ ํญ๋ชฉ ์ฆ, li์ ๋ฃ์ด ์ฃผ์ด์ผ ํ๋ฏ๋ก newTodo์ id๋ฅผ ๊ฐ์ ธ์ ๋ถ์ฌํด ์ฃผ๋ฉด ๋๋ค.
function paintToDo(newTodo) {
const li = document.createElement("li");
li.id = newTodo.id;
const span = document.createElement("span");
span.innerText = newTodo.text;
.
.
.
}
function handleTodoList(event) {
event.preventDefault();
const newTodo = toDoInput.value;
toDoInput.value = "";
const newTodoObj = {
text:newTodo,
id: Date.now()
}
toDos.push(newTodoObj);
paintToDo(newTodoObj);
saveToDos();
}
๋ฐฐ์ด์ ์์๋ฅผ ์ญ์ ํ ๋, ๋ฐฐ์ด์ ์์๋ฅผ ์์ ์ง์ด๋ค๊ณ ์๊ฐํ ์ ์๋๋ฐ ์ค์ ๋ก ์ผ์ด๋๋ ๊ฒ์ ์ง์ฐ๊ณ ์ถ์ ์์๋ฅผ ์ ์ธํ ํ์ ์ ๋ฐฐ์ด์ ๋ง๋๋ ๋ฃจํด์ด๋ค. ํํฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋ ์ดํด๊ฐ ๋น ๋ฅผ ์ ์๊ฒ ๋ค. ์ง์ฐ๊ณ ์ถ์ ์์๋ฅผ ๊ฑธ๋ฌ๋ธ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก, ์ฐ๋ฆฌ๋ filter ํจ์๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค. ๋จผ์ todoFilter๋ผ๋ ์ด๋ฆ์ ํจ์๋ฅผ ๋ง๋๋๋ฐ, ์ด ํจ์๋ true๋ง์ returnํ๋ค. ๋ง์ฝ false๋ฅผ returnํ๊ฒ ๋๋ค๋ฉด, false์ธ ์์๋ ์ ์ธ๋๊ฒ ๋๋ค. ์ฆ, ์ ์งํ๊ณ ์ถ์ ์์๋ true๊ฐ ๋์ด์ผ ํ๊ณ , ์ ์ธํ๊ณ ์ถ์ ์์๋ false๊ฐ ๋์ด์ผ ํ๋ค.
๋ง์ฝ, 3์ ์ง์ฐ๊ณ ์ถ๋ค๋ฉด? item๋ค ์ค์ ์๋ 3์ false๋ก ๋ง๋ค๋ฉด ๋๋ค๋ ๋ง์.
๊ทธ๋ผ ์ด๊ฒ์ ์ฐ๋ฆฌ์ ๋ฐฐ์ด์ ์ ๋ชฉ์์ผ์ ํ์ฉํด ๋ณด์. ์ด๋ก์จ, ์ฐ๋ฆฌ๋ filter ํจ์๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ ์ง ์ ์ ์๋ค. ๋ฌผ๋ก id๊ฐ ์๋ text๋ก๋ ๊ฐ๋ฅํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด์ ์ด๊ฑธ ์ด์ฉํ ์ฝ๋๋ฅผ li ์์๋ฅผ ์ง์ฐ๋ ํจ์ ์์ ์์ฑํด ์ฃผ์. ๊ทธ๋ผ ์ฐ๋ฆฌ๊ฐ ์ํ๋๋๋ก ์ญ์ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ญ์ ๊ฐ ๋์ด์ผ ํ์ง๋ง, ์ฌ์ ํ ๋ฐฐ์ด์ ๋จ์ ์๋ค. ์ด์ ๋ ๋ฐ์ดํฐ ํ์ ์ ์๋ค. ์ค์ ๋ก ๋ฐฐ์ด ์์ ์๋ id๋ number์ธ๋ฐ, ์ฐ๋ฆฌ๊ฐ ์ญ์ ํ๋ target์ id๋ string์ด๊ธฐ ๋๋ฌธ์ด๋ค.
function deleteTodo(event) {
const li = event.target.parentElement;
li.remove();
toDos = toDos.filter(toDo => toDo.id !== li.id);
};
์ด๋ฐ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ ํ์ ์ ๋ณ๊ฒฝํด ์ฃผ๊ธฐ๋ง ํ๋ฉด ๊ฐ๋จํ๋ค. parseInt๋ก string์ number๋ก ๋ณํํด ์ฃผ์. ๊ทธ๋ฆฌ๊ณ , saveToDos ํจ์๋ฅผ ํธ์ถํด ์ฃผ์ด์ผ ํ๋ค. ์๋ํ๋ฉด ์ ์ธ์ํจ ์๋ก์ด ๋ฐฐ์ด์ ์ ์ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์. ์ด๋ก์จ To Do List ๊ตฌํ์ด ๋๋ฌ๋ค.
function deleteTodo(event) {
const li = event.target.parentElement;
li.remove();
toDos = toDos.filter(toDo => toDo.id !== parseInt(li.id));
saveToDos();
};
To Do List ํํธ๋ฅผ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
๊ณ์ ์ค๊ฐ ์ค๊ฐ ์ผ์ด ์์ด์ ์งฌ์งฌ์ด ๋ฃ๋๋ผ ์ค๋ ๊ฑธ๋ ธ๋ ํํธ...... ๊ทธ๋๋ ์ฌํ ๋ฐฐ์ด ๊ฒ๋ค์ ํ์ฉํ๋ ํํธ๋ผ์ ํฌ๊ฒ ์ด๋ ค์์ ์์๋ ๊ฒ ๊ฐ๋ค. ๋ฐฐ์ด๊ณผ ๋ฉ์๋๋ค์ ๋ํด ๋ค์ ํ ๋ฒ ์๊ธฐํ๊ณ ๊ณต๋ถํ๋ ๊ณ๊ธฐ๊ฐ ๋๊ธฐ๋ ํ๊ณ . ์ด์ ๋ง์ง๋ง ๋ ์จ ๊ตฌํ๋ง ๋จ์๋๋ฐ, ์ ์ ํด ๋ณธ API ์ฌ์ฉ์ด๋ผ ์ด ๋ถ๋ถ๋ ํฌ๊ฒ ์ด๋ ค์์ ์์ผ๋ฆฌ๋ผ ์๊ฐ๋๋ค. ๋ถ์ง๋ฐํ๊ฒ ํด ๋ณด์!