์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- tailwindcss
- ์น ๋ธ๋ผ์ฐ์ ๊ตฌ์กฐ
- typescript
- ์ฝ๋ฉ๋ ํ
- tanstack-query
- ์ฝ์ฝ์ํก ํด๋ก ์ฝ๋ฉ
- HTML ํ์ผ๊ตฌ์กฐ
- JS
- ๋ ธ๋ง๋์ฝ๋
- react
- ๋ฐ๋๋ผ JS๋ก ํฌ๋กฌ ์ฑ ๋ง๋ค๊ธฐ
- clone coding
- next.js
- ํ๋ก ํธ์๋
- jest
- axios-mock-adapte
- javascript
- ๋ฐ๋๋ผ JS๋ก ๊ทธ๋ฆผํ ๋ง๋ค๊ธฐ
- HTML
- canvas js
- JAVA Script
- ์น ๋ธ๋ผ์ฐ์ ๋ ๋๋ง
- canvas image
- ๋ ธ๋ง๋ ์ฝ๋
- queryprovider
- ์ฝ๋ฉ์ผ๊ธฐ
- ์ํ์ฝ๋ฉ
- canvas
- negative margin
- CSS
- Today
- Total
Coding Archive
๋ ธ๋ง๋ ์ฝ๋ - ๋ฐ๋๋ผ JS๋ก ํฌ๋กฌ ์ฑ ๋ง๋ค๊ธฐ(8) ๋ณธ๋ฌธ
๋ ธ๋ง๋ ์ฝ๋ - ๋ฐ๋๋ผ JS๋ก ํฌ๋กฌ ์ฑ ๋ง๋ค๊ธฐ(8)
์ฝ๋ฑ์ด 2022. 6. 13. 15:24#7 TO DO LIST
0. Setup
html
<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>
1) Todo-list๋ฅผ ๋ง๋ค๊ธฐ ์ํด html์ form ํ๊ทธ๋ก ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด ์ค๋ค. ๋์ค์ JavaScript์์ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ id๋ todo-form์ผ๋ก ์ค์ ํ๋ค.
2) form ์์ฒด๋ submit์ด๋ผ๋ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๋ด์ฅํ ํ๋์ ๋ฌถ์์ผ ๋ฟ์ด๋ค. ์ ์ ๊ฐ todo-list์ ๋ฌด์ธ๊ฐ๋ฅผ ๊ธฐ์ ํ๋ ๊ฒ์ ์ํ๊ธฐ ๋๋ฌธ์ form ํ๊ทธ ์์ input ํ๊ทธ๋ฅผ ๋ฃ์ด 'text'๋ฅผ ํ์ดํํ ์ ์๋๋ก ํ๋ค.
3) ๊ทธ ๋ฐ์ ul ํ๊ทธ๋ฅผ ์์ฑํ์ฌ todo-list์ ์์ฑ๋ text๊ฐ ์ ์ฅ ๋ฐ ๋์ด๋ ์ ์๊ฒ ํ๋ค.
JavaScript
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();
const newTodo = toDoInput.value;
toDoInput.value = "";
}
toDoform.addEventListner("submit", handleTodoSubmit);
1) ์์ html์์ ๋ง๋ ๊ตฌ์กฐ 3๊ฐ์ง ('todo-form', 'todo-form ์์ input', 'todo-list')๋ฅผ ๊ฐ๊ฐ ๋ณ์๋ก ์ค์ ํ๋ค.
2) ์ด์ greeting ๊ฐ์์์ form ํ๊ทธ์์์ event๋ submit๋ฅผ ๋ฐ์์ํค๊ณ , ๋ธ๋ผ์ฐ์ ๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ๋์ด ์๋ ์๋ก๊ณ ์นจ์ ํ๊ฒ ๋๋ค๊ณ ํ๋๋ฐ, todo-list๋ฅผ ์์ฑํ ๋๋ง๋ค ๋งค๋ฒ ์๋ก๊ณ ์นจ ๋๋ค๋ฉด ๋งค์ฐ ๋นํจ์จ์ ์ผ ๊ฒ์ด๋ค.
(todo-list๋ฅผ 1,000๋ฒ ์์ฑํ๋ค๊ณ ๊ฐ์ ํ๋ค๋ฉด ๋ถํ์ํ ์๋ก๊ณ ์นจ์ด 1,000๋ฒ ๋ฐ์ํ๊ณ 1,000๋ฒ์ ๋๋ค ํ ์ด๋ฏธ์ง๊ฐ ๋ก๋๋๋ค. → ๋ฐ์ดํฐ์ ์ผ๋ก ๋นํจ์จ์ , ์๊ฐ์ ์ผ๋ก ๋ถํธ)
์ด๋ฅผ ๋ง๊ธฐ์ํด event.preventDefault()๋ก ๊ธฐ๋ณธ๊ฐ์ ์์ ์ค๋ค.
3) text ์์ ์์ ๊ธ์ ์์ฑํ๊ณ enter๋ฅผ ๋๋ ์ ๋, ๊ทธ ๊ธ์ด ์ด๊ธฐํ ๋๊ฒ ๋ง๋ค๊ธฐ ์ํด toDoInput.value = ""; ์ ํตํด value๋ฅผ ๋น ํ ์คํธ๋ก ํ๋ค.
4) text ์์๋ฅผ ๋น๊ฒ ํ๊ธฐ ์ ์ ์ ์ ๊ฐ ์ ๋ ฅํ ํ ์คํธ๋ฅผ ์ ์ฅํด์ผ ๋์ค์ ulํ๊ทธ ์์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ toDoInput.value = ""; ๋ก ๊ธฐ์ ํ ํ ์คํธ๊ฐ ์ฌ๋ผ์ง๊ธฐ ์ด์ ์ const newTodo = toDoInput.value; ๋ฅผ ์ ์ํด ๊ธฐ์ ํ ํ ์คํธ๊ฐ newTodo๋ผ๋ ๊ฐ์ ์ ์ฅ๋๊ฒ ํ๋ค.
5) ์์ ์ธ ๊ฐ์ง ๋์(๊ธฐ๋ณธ๊ฐ ๋ฐฉ์ง, ํ ์คํธ ์ ์ฅ, text ์์ ๋น์ฐ๊ธฐ)์ ํ ๋ฒ์ ์ด๋ฃจ์ด์ง๋ ์ธํธ์ด๊ธฐ ๋๋ฌธ์ ํจ์จ์ฑ ๋ฐ ํธ์๋ฅผ ์ํด handleTodoSubmit() ํจ์๋ก ๋ฌถ์ด์ค๋ค.
6) todo-form ์์์ submit์ด ๋ฐ์ํ๋ ํน์ ์ํฉ์์ handleTodoSubmmit ํจ์๋ฅผ ์คํ์ํค๊ธฐ ์ํด
toDoform.addEventListner("submit", handleTodoSubmit); ์ ๊ธฐ์ ํ๋ค.
(ํจ์ handleTodoSubmit์ด ํญ์ ์คํ๋๊ณ ์๋ ์ํ๋ผ๋ฉด text ์ฐฝ์ ํญ์ ๋น์ด์๋ ์ํ ์ผ ๊ฒ์ด๊ธฐ ๋๋ฌธ์)
1. Adding ToDos
review
์ด์ ์์์์ hadle.ToDoSubmit() ํจ์๋ฅผ ๋ง๋ค์๊ณ ,
event.preventDefault(); // ์๋ก๊ณ ์นจ์ ๋ง๊ณ
const newTodo = toDoInput.value; // submitํ๋ ํ
์คํธ๋ฅผ ์ ์ฅํ๊ณ
toDoInput.value = ""; // ํ
์คํธ์์ ์์ ํ
์คํธ๋ฅผ ์ด๊ธฐํ์์ผฐ๋ค.
์ ๋ ฅํ ํ ์คํธ(todo)๊ฐ ํ์ด์ง์ ๋ณด์ด๋ ๊ฒ์ ์ํ๊ธฐ ๋๋ฌธ์ ๊ทธ์ ๋ง๋ ์ฝ๋๋ฅผ ์์ฑํ ๊ฒ์ด๋ค.
html
์ด๋ฏธ html์ todo-list๋ผ๋ id๋ฅผ ๊ฐ์ง ulํ๊ทธ๋ฅผ ์์ฑํด ๋์๊ณ , ์ด์ ๋ ์๋ก์ด ํ ์คํธ๊ฐ ์ ๋ ฅ๋ ๋๋ง๋ค ๊ทธ ์์ li ํ๊ทธ๋ฅผ ์์ฑํ์ฌ ๋์ดํ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ js์์ ์ด๋ฅผ ๊ตฌํํ ์ ์๋๋ก ์ฝ๋๋ฅผ ์ง์ผํ๋ค.
JavaScript - todo list๋ฅผ ์นํ์ด์ง์์ ์๊ฐํํ๊ธฐ
function paintToDo(newTodo) {
const li = document.createElement("li");
const span = document.createElement("span");
li.appendChild(span);
span.innerText = newTodo.text;
toDoList.appendChild(li);
}
1) html์ liํ๊ทธ๋ฅผ ์์ฑํ๊ฒ ํ๋ค.
2) html ๋ด์์ spanํ๊ทธ๋ฅผ ์์ฑํ๊ฒ ํ๋ค. (๋์ค์ ๋ฆฌ์คํธ ์ญ์ ์๋ฅผ ์ํด span ํ๊ทธ๋ฅผ ์จ์ค)
3) li ํ๊ทธ ์์ spanํ๊ทธ๋ฅผ ์์์ผ๋ก ๋ง๋ค์ด์ค๋ค. (li ์์ span์ ๋ฃ์ด์ฃผ๋ ์ด์ -> ๋ฒํผ์ ํจ๊ป ๋ฃ์ด์ฃผ๊ธฐ ์ํด)
4) span ํ๊ทธ ์์ ํ ์คํธ๊ฐ ์์์ ์ค์ ํ newTodo๋ผ๋ ๊ฐ์ฒด๊ฐ ๋๋๋ก ํ๋ค. (newTodo๋ ํ ์คํธ์ ์ ๋ ฅํ value๊ฐ)
ex) ํ ์คํธ ์์ ์์ "์๋ "์ ์ ๋ ฅํ๋ฉด newTodo๋ "์๋ "์ด๋ฏ๋ก span์์ ํ ์คํธ๋ "์๋ "์ด ๋๋ค.
5) html์ ul ํ๊ทธ ์์ li ํ๊ทธ๋ฅผ ์์์ผ๋ก ๋ง๋ค์ด ์ค๋ค. (span์ li์ ์ํ๊ฒ ํ ๊ฒ๊ณผ ๋์ผ)
6) handleTodoSubmit ํจ์์ paintToDo(newTodo); ๋ฅผ ์ถ๊ฐํด handleTodoSubmit ํจ์๊ฐ ์คํ๋๋ฉด, paintToDoํจ์๊ฐ ์คํ๋๋๋ก ํ๋ค.
+) Q
์๋ฐ์คํฌ๋ฆฝํธ๋ก HTMLํ๊ทธ๋ฅผ ์์ฑํ ๋ appendChild์ append๋ผ์ ์ฐจ์ด
-
append()๊ฐ ์ถ๊ฐํ ์ ์๋ ์ข ๋ฅ๊ฐ ๋ ๋ง๋ค.
append()๋ก๋ ๋ฌธ์์ด๋ ์ถ๊ฐ๊ฐ ๊ฐ๋ฅํ๋ฐ, appendChild()๋ก๋ ๊ฐ์ฒด๋ง ์ถ๊ฐํ ์ ์๋ค.
ex)
li.append("์๋ ํ์ธ์") → (๊ฐ๋ฅ)
li.appendChild("์๋ ํ์ธ์") → (๋ถ๊ฐ๋ฅ - typeError)
๊ทธ๋ฆฌ๊ณ console.log๋ก ๋ ๊ฐ๋ฅผ ๋ณด๋ฉด append()ํ๊ณ appendChild()๊ฐ ๋ค๋ฅด๊ฒ ๋์จ๋ค.
+) Q
๊ตณ์ด handleTodoSubmit ํจ์์ paintToDoํจ์๋ฅผ ๋ถ๋ฆฌํ ์ด์ ๋? ๊ฐ์ด ์จ๋ ๋๊ฐ์ด ์๋ํ๋ค.
-
paintToDoํจ์๊ฐ ๋ ์ฐ์ผ ์ ์์ผ๋ ์ธ๋ฐ์์ด ์ค๋ณต๋์ง ์๊ฒ ๋ฐ๋ก ๋ถ๋ฆฌํด์ ์ ๋๋ค.
๋ํ ์ฌ๋ฌ๋ช ๊ณผ ํจ๊ป ์ผํ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด์ ๋ฐ๋ก ์ ๋๋ค.
2. Deleting To Dos
JavaScript - html์ ์ญ์ button ํ๊ทธ ๋ง๋ค๊ธฐ
function paintToDo(newTodo) {
const li = document.createElement("li");
const span = document.createElement("span");
span.innerText = newTodo.text;
const button = document.createElement("button");
button.innerText = "โ";
button.addEventListener("click", deleteToDo);
li.appendChild(span);
li.appendChild(button);
toDoList.appendChild(li);
}
1) createElement๋ฅผ ์ด์ฉํด html์ button ํ๊ทธ๋ฅผ ์์ฑํ๊ฒ ํ๋ค.
2) ์ ์ ์๊ฒ ๋ฒํผ์ ๋๋ฅด๋ฉด ํ ์คํธ๊ฐ ์ญ์ ๋๋ค๋ ๊ฒ์ ์ธ์์ํค๊ธฐ ์ํด ๋ฒํผ ๋ด๋ถ ํ ์คํธ๋ฅผ "โ"๋ก ์ ์ (์๋์ฐ ๊ธฐ์ค : window + . )
3) ๋ฒํผ์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์ญ์ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ ํจ์๊ฐ ์คํ๋๋๋ก ํ๋ค. ์ฌ๊ธฐ์์ "click"์ด ๋ฐ์ ์, deleteToDoํจ์๊ฐ ์คํ๋๋๋ก ํ๋ค.
JavaScript - ์ญ์ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ ํจ์ ์์ฑ
function deleteToDo(event) {
const li = event.target.parentElement;
li.remove();
}
1) event.target.parentElement; => ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋.ํด๋น ๊ฐ์ฒด๋ฅผ ์ง์ ํ์ฌ.๊ทธ๊ฒ์ ๋ถ๋ชจ ํ๊ทธ๋ฅผ ์ง์ ;
event๋ target(= event๋ฅผ ๋ฐ์์ํจ ์ฅ๋ณธ์ธ. target์ ํด๋ฆญ๋ HTML element)์ ์ค๋ค. (์ฌ๊ธฐ์๋ button)
parentElement๋ก target์ ๋ถ๋ชจ(= li)์ ์ ๊ทผ.
2) ์์์ ์ง์ ๋ ๊ฒ์ ์ญ์ ํ๋ค.
3. Saving To Dos
JavaScript - ์ ์ฅ ๊ธฐ๋ฅ ํจ์ ๋ง๋ค๊ธฐ
const toDos = [];
function deleteToDo(event) {
localStorage.setItem("todos", JSON.stringify(toDos));
}
1) toDo์ ๋ค์ด์ค๋ ํ ์คํธ๋ฅผ ๋ฐฐ์ด๋ก ๋ฌถ์ด ๋ณด๊ดํ๊ธฐ ์ํด ๋น array๋ฅผ ์์ฑํด์ค๋ค.
2) newTodo๊ฐ ๊ทธ๋ ค์ง ๋๋ง๋ค(paintToDoํจ์๊ฐ ์คํ๋ ๋๋ง๋ค) ๊ทธ ํ ์คํธ๋ฅผ array์ pushํ๊ณ ์ถ๊ธฐ ๋๋ฌธ์,
newTodo๋ฅผ ๊ทธ๋ฆฌ์ง ์ ์(paintToDo ํจ์๊ฐ ์คํ๋๊ธฐ ์ ์) toDos array๋ฅผ ๊ฐ์ง๊ณ ์์ newTodo๋ฅผ push ํด์ค๋ค.
ํจ์ handleToDosubmit ์์ toDos.push(newTodo); ๋ฅผ paintToDo(newTodo); ์์ ์จ์ค๋ค.
3) ์ ์ฅ ๊ธฐ๋ฅ์ ๋ฃ์ ํจ์ saveToDos ์์ฑํ๊ณ ,
function saveToDos( ) { localStorage.setItem("todos", toDos); }
→ localStorage์ "todos"๋ผ๋ ์ด๋ฆ์ ์นดํ ๊ณ ๋ฆฌ๋ก, array ํํ๋ก ์ ์ฅํ๋ค.
4) ์์์ ๋ง๋ค์๋ ํจ์ handleToDosubmit์ ๋ง์ง๋ง์ ์ ์ฅ ๊ธฐ๋ฅ์ ์คํํ saveToDos(); ์ถ๊ฐํด์ค๋ค.
5) ํ์ง๋ง 3)์ฒ๋ผ ์ ์ฅํ๊ฒ ๋๋ฉด localStorage์์ ํ์ธํด๋ดค์ ๋ ๊ฐ๋ค์ด ํ ์คํธ ํํ๋ก ์ ์ฅ๋๋ค.
(์ค์ ๋ก๋ arrayํํ๊ฐ ์๋)
ex) key: todos / value: a, b, c
6) ์ด ๊ฐ๋ค์ string์ ํํ๋ก toDos๋ผ๋ array์ ์ง์ด๋ฃ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ JSON.stringify()๋ฅผ ์ฌ์ฉํ๋ค.
์ด ๊ฐ์ฒด๋ ์ด๋ค ํํ๋ ๋์ ํ ๊ฐ์ ์์์ string์ ํํ๋ก ๋ฐ๊ฟ์ค๋ค.
ex) key: todos / value: ["a", "b", "c"]
+) Q
json.stringify ์ฐ๊ธฐ ์ ์ localStorage์ ๊ฐ์ด a, b, c ์๊ณ ์ฐ๊ณ ๋์๋ “a”, “b”,”c”๊ฐ ๋๋๋ฐ ๊ฐ์ string ํ์ ์๋๊ฐ?
๋์ ์ฐจ์ด๋? ๊ทธ๋ฆฌ๊ณ stringify๋ฅผ ์ฐ๊ธฐ ์ ์ ๊ฐ์ ํ ์คํธ, ์ฐ๊ณ ๋์๋ string์ด๋ผ๊ณ ํ๋๋ฐ ๊ทธ ์ด์ ๋ ๊ถ๊ธ.
(๋จ์ ํ ์คํธ์ string์ ์ฐจ์ด)
-
'text' does not exist. We only have 'string’
text๋ ๋ฐ์ดํฐ ํ์ ์ด ์๋๊ณ , string๋ง ๋ฐ์ดํฐ ํ์ ์ด๋ผ๊ณ ๋งํ๋ ๊ฒ ๊ฐ๋ค.
'๐ฅ๏ธ Clone Coding' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ ธ๋ง๋ ์ฝ๋ - ๋ฐ๋๋ผ JS๋ก ํฌ๋กฌ ์ฑ ๋ง๋ค๊ธฐ(10) (0) | 2022.06.19 |
---|---|
๋ ธ๋ง๋ ์ฝ๋ - ๋ฐ๋๋ผ JS๋ก ํฌ๋กฌ ์ฑ ๋ง๋ค๊ธฐ(9) (0) | 2022.06.14 |
๋ ธ๋ง๋ ์ฝ๋ - ๋ฐ๋๋ผ JS๋ก ํฌ๋กฌ ์ฑ ๋ง๋ค๊ธฐ(7) (0) | 2022.06.11 |
๋ ธ๋ง๋ ์ฝ๋ - ๋ฐ๋๋ผ JS๋ก ํฌ๋กฌ ์ฑ ๋ง๋ค๊ธฐ(6) (0) | 2022.06.10 |
๋ ธ๋ง๋ ์ฝ๋ - ๋ฐ๋๋ผ JS๋ก ํฌ๋กฌ ์ฑ ๋ง๋ค๊ธฐ(5) (0) | 2022.06.09 |