
๐ ๋ฆฌ์คํธ ๋ฑ๋ก ์, ์
๋ ฅํ input value๊ฐ์ ๊ทธ๋๋ก ๋ฆฌ์คํธ์ ์ถ๊ฐ
๐ ๋ฆฌ์คํธ ์ญ์ ์, ์ ํํ ๋ฆฌ์คํธ๋ฅผ ์ฐพ์ ์ญ์ ํด์ผํ๋ ๋ก์ง
๐ createElement()์ append() ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ ์คํฌ๋ฆฝํธ๋ก DOM ์์ ์์ฑ
๐ ์ ํํ ๋ฆฌ์คํธ๋ฅผ ๋งค์นญ ์ํค๊ธฐ ์ํด id๊ฐ์ผ๋ก ๊ตฌ๋ถ์ด ํ์ (Date.now()๋ผ๋ ์์ฑ์ ํจ์ ์ฌ์ฉ)
๐ filter ์์ฑ์ ์ฌ์ฉํ์ฌ id ๊ฐ์ด ๋งค์นญ๋๋ ๋ฆฌ์คํธ ๊ตฌ๋ถ
๐ localStorage์ ํ
์คํธ ํ์
์ผ๋ก ์ ์ฅ์ํค๊ธฐ ์ํด JSON.stringify() ์์ฑ ์ฌ์ฉ
๐ ํ
์คํธ ํ์
์ผ๋ก ์ ์ฅ๋ localStorage ๋ฐ์ดํฐ ๊ฐ์ ๋ค์ ๋ฐฐ์ด๋ก ์ ์ฅ์ํค๊ธฐ ์ํด JSON.parse() ์์ฑ ์ฌ์ฉ
๐ฉต ํ ์คํธ๋ฅผ ์ ๋ ฅํ input ํผ ์์ฑ
๐ฉต ์ ์ฅ๋ list๋ฅผ ๋ ธ์ถ ์ํฌ ๋ฆฌ์คํธ ์์ญ ์์ฑ
<body>
<form id="todo-form">
<input type="text" placeholder="Write a To Do and Press Enter" required>
</form>
<ul id="todo-list"></ul>
</body>
๐ฉต To-do list์ ์๋ก์ด ํญ๋ชฉ์ ์ถ๊ฐ
๐น ๋ฑ๋ก๋ ๋ฆฌ์คํธ๋ li > span + button ๊ตฌ์กฐ๋ก ๋งํฌ์
๋๋๋ก createElement ๋ฉ์๋๋ฅผ ์ฌ์ฉ
<script>
function paintTodo(newTodo){
// ์ ๋ฌ๋ฐ์ newTodo๋ handleTodoSubmitํจ์์์ ์คํ์ํจ todoInput.value๊ฐ์ ์๋ฏธ
const li = document.createElement("li");
li.id = newTodo.id;
const span = document.createElement("span");
span.innerText = newTodo.text;
const deleteBtn = document.createElement("button");
deleteBtn.innerText = "โ";
deleteBtn.addEventListener("click", deleteTodo);
li.append(span);
li.append(deleteBtn);
todoList.append(li);
}
</script>
๐ฉต input์ด submit๋๋ฉด handleTodoSubmit() ํจ์ ์คํ
๐น ์
๋ ฅํ value ๊ฐ์ newTodo ๋ณ์์ ์ ์ฅ (๋ฆฌ์คํธ์ value ๊ฐ์ ๋
ธ์ถ์์ผ์ผํ๊ธฐ ๋๋ฌธ)
๐น input์ด submit๋๋ฉด value ๊ฐ์ ๊ณต๋ฐฑ์ผ๋ก ๋ฆฌ์
๐น ๋ฑ๋กํ ๋ฆฌ์คํธ(text)๋ฅผ newTodoObj ๊ฐ์ฒด๋ก ๋ณํํ์ฌ todos ๋ฐฐ์ด์ ์ถ๊ฐ
๐น id๋ ๋ฆฌ์คํธ ์ญ์ ์, ํด๋ฆญํ ๋ฆฌ์คํธ์ ๋งค์นญ ์์ผ์ผ ํ๊ธฐ ๋๋ฌธ์ ์์๋ก Date.now(๋ฑ๋ก์๊ฐ) ๊ฐ์ ๋ถ์ฌ
๐น paintTodo()ํจ์ ์คํ ์, ์ธ์๋ก newTodoObj๋ฅผ ์ถ๊ฐ (=์๋ก์ด ํ ์ผ ์ถ๊ฐ)
๐น saveTodos()๋ฅผ ํธ์ถํ์ฌ localStorage์ ์ ์ฅ
<script>
function handleTodoSubmit(event){
event.preventDefault();
const newTodo = todoInput.value;
todoInput.value = ""; // ์
๋ ฅ ํ ๊ณต๋ฐฑ์ผ๋ก ์
๋ฐ์ดํธ
//newTodo๋ฅผ todos์ ๋ฐฐ์ด(array)๋ก ์ ์ฅ
const newTodoObj = {
text:newTodo,
id:Date.now(),
}
todos.push(newTodoObj);
paintTodo(newTodoObj); // todos ๋ฐฐ์ด์ list๋ก ์์ฑ
saveTodos();
}
todoForm.addEventListener("submit", handleTodoSubmit);
</script>
๐ฉต ์ญ์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด deleteTodo() ํจ์ ์คํ (=๋ฆฌ์คํธ ์ญ์ )
๐น handleTodoSubmit()ํจ์์์๋ id๋ ๋ฆฌ์คํธ ์ญ์ ์, ํด๋ฆญํ ๋ฆฌ์คํธ์ ๋งค์นญ ์์ผ์ผ ํ๊ธฐ ๋๋ฌธ์ ์์๋ก Date.now(๋ฑ๋ก์๊ฐ) ๊ฐ์ ๋ถ์ฌํ์๋ค.
๐น ํด๋ฆญํ ๋ฆฌ์คํธ์ ๋ถ๋ชจ์์๋ฅผ li๋ผ๋ ๋ณ์์ ์ ์ฅ
๐น todos ๋ฐฐ์ด ์ค filter ์์ฑ์ ์ฌ์ฉํ์ฌ todo.id๊ฐ๊ณผ li.id๊ฐ์ด ๋ค๋ฅธ ๋ฆฌ์คํธ๋ง todos์ ์ ์ฅ (์ฆ, ์ญ์ ๋ฒํผ์ ํด๋ฆญํ ํด๋น li์ id์ ์ผ์นํ๋ ํญ๋ชฉ์ ์ ์ธํ๊ณ ๋๋จธ์ง ํ ์ผ๋ง ๋จ๊น)
๐น saveTodos()๋ฅผ ํธ์ถํ์ฌ ๋ณ๊ฒฝ๋ ๋ชฉ๋ก์ ์ ์ฅ
<script>
function deleteTodo(event){
// console.log("delete click!");
const li = event.target.parentElement;
// event(ํด๋ฆญ)๋์์ ๋ถ๋ชจ์์
todos = todos.filter(function(todo){
return todo.id !== parseInt(li.id);
})
li.remove();
// console.log(li.id);
saveTodos();
};
</script>
๐ฉต ๋ฆฌ์คํธ๋ฅผ ์๊ตฌ์ ์ผ๋ก localStorage์ ์ ์ฅ์ํค๊ธฐ ์ํ ํจ์
๐น localStorage.setItem()์ ์ฌ์ฉํ์ฌ todos ๋ฐฐ์ด์ ๋ฌธ์์ด๋ก ๋ณํํ ํ ์ ์ฅ. (๋ฐฐ์ด์ JSON.stringify()๋ฅผ ์ฌ์ฉํด ํ
์คํธ๋ก ๋ณํ)
<script>
function saveTodos(){
localStorage.setItem(TODOS_KEY, JSON.stringify(todos));
//["a", "b", "c"]์ฒ๋ผ ํ
์คํธ ํ์
์ผ๋ก ์ ์ฅ๋จ
}
</script>
๐ฉต ํ์ด์ง๊ฐ ๋ก๋๋ ๋, localStorage.getItem(todos)์ ์ฌ์ฉํ์ฌ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , JSON.parse()๋ก ๋ค์ ๊ฐ์ฒด ๋ฐฐ์ด๋ก ๋ณํ
๐น JSON.stringify() : ๋ฐฐ์ด/๊ฐ์ฒด๋ฐ์ดํฐ๋ฅผ "ํ
์คํธ"ํ์
์ผ๋ก ๋ณํ
๐น JSON.parse() : ํ
์คํธ๋ฅผ "๋ฐฐ์ด"๋ก ๋ณํ
๐ฉต localStorage์ ์ ์ฅ๋ ๊ฐ์ด ์กด์ฌํ๋ค๋ฉด
๐น ๋ณํ๋ ๋ฐ์ดํฐ๋ฅผ todos ๋ฐฐ์ด์ ํ ๋นํ๊ณ , paintTodo()๋ก ๋ชฉ๋ก์ ๋ค์ ๊ทธ๋ฆฝ๋๋ค.
๐น forEach()**๋ ๋ฐฐ์ด์ ๋ชจ๋ ํญ๋ชฉ์ ๋ํด ๋ฐ๋ณต ์์
์ ์ํํ ๋ ์ฌ์ฉ. localStorage์์ ๊ฐ์ ธ์จ ํ ์ผ ๋ชฉ๋ก์ ํ๋ฉด์ ํ์ํ ๋ ์ฌ์ฉ
<script>
const savedTodos = localStorage.getItem(TODOS_KEY);
// console.log(savedTodos);
if(savedTodos !== null){
const parsedTodos = JSON.parse(savedTodos);
// console.log(parsedTodos);
todos = parsedTodos;
parsedTodos.forEach(paintTodo);
}
</script>