potatos
๐•๐•’๐•ฆ๐•ฃ๐•ฆ๐•ค
potatos
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
    • Daily
    • Study
      • CS
      • Network
      • Windows
      • Linux
      • HTML & CSS
      • JavaScript
      • React
      • vue.js
      • Flutter
      • DataBase
      • Elastic Se..
      • Log
      • Coding Tes..
    • Work
      • PC
      • Mobile
      • JPGIF

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

  • notice

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • ์ˆ˜์ง ์ •๋ ฌ
  • JavaScript
  • Linux
  • ์œˆ๋„์šฐ
  • HTML
  • CSS
  • ์…€๋ ‰ํ„ฐ
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
  • MySQL
  • Windows

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
potatos

๐•๐•’๐•ฆ๐•ฃ๐•ฆ๐•ค

[JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #To Do List
Study/Log

[JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #To Do List

2022. 5. 31. 18:25

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 ์‚ฌ์šฉ์ด๋ผ ์ด ๋ถ€๋ถ„๋„ ํฌ๊ฒŒ ์–ด๋ ค์›€์€ ์—†์œผ๋ฆฌ๋ผ ์ƒ๊ฐ๋œ๋‹ค. ๋ถ€์ง€๋Ÿฐํ•˜๊ฒŒ ํ•ด ๋ณด์ž!

'Study > Log' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #Weather & ๋งˆ๋ฌด๋ฆฌ  (0) 2022.06.16
[JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #Quotes And Background  (0) 2022.05.19
[JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #Clock  (0) 2022.05.17
[JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #Momentum ์†Œ๊ฐœ ๋ฐ Login  (0) 2022.05.15
    'Study/Log' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #Weather & ๋งˆ๋ฌด๋ฆฌ
    • [JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #Quotes And Background
    • [JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #Clock
    • [JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #Momentum ์†Œ๊ฐœ ๋ฐ Login
    potatos
    potatos

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”