[Toy Project 1] 바닐라 js + HTML + CSS 이용한 Chrome Web 제작 06

오늘은 to-do list를 만들어보자!
📖to-do list 만들기
1. Adding to-dos
✍ example
//html
<form id="todo-form">
<input type="text"class="todoinput" placeholder="Write a To Do and Press Enter">
</form>
//javascript
function handleToDoSubmit(event){
event.preventDefault();
const newTodo=todoInput.value;
console.log(todoInput.value="");
paintToDo(newTodo);
}
todoForm.addEventListener("submit", handleToDoSubmit);
- 먼저 to-dos를 입력할 수 있는 input을 html에 추가.
- to-do list 창에 할일을 입력하고 엔터를 눌렀을 때 새로고침되지 않도록
preventDefault()함수 사용. - 엔터를 누를 때마다, 입력한 것을 비우기 위해
console.log(todoInput.value="")추가.
✍ example
function paintToDo(newTodo){
const li=document.createElement("li");
const span=document.createElement("span");
const button=document.createElement("button");
li.appendChild(span);
li.appendChild(button);
span.innerText=newTodo;
console.log(li);
}
paintToDo()는 to-dos를 받아 html에 element를 생성하여 화면에 출력할 수 있도록 해주는 함수.document.createElement()를 이용하여 html에 li, span, button과 같은 element 생성 가능.appendChild()는 element에 마지막 자식 요소를 생성해주는 함수.span.innerText=newTodo유저로 부터 받은 to do list를 span에 입력.
appendChild()는 인자를 가장 뒤에 놓는다. 따라서 button이 span보다 뒤에 올 것이다!!
✔ 결과 확인

2. Deleting to-dos
✍ example
//javascript
function deleteTodo(event){
const li=event.target.parentElement;
li.remove();
}
button.addEventListener("click",deleteTodo);
- 인자로 전달된 event는 어떤 button이 클릭되었는지를 알려주는 property를 가지고 있음.
- 클릭된 버튼의
target을 이용하여parentNode나parentElement를 이용해서 무엇을 삭제해야하는 지 알 수 있음. target은 event가 발생한(여기서는 클릭된) html의 element.parentElement는 클릭된 element의 부모.- 클릭된
button의 부모는span이므로event.target.parentElement을 이용하면 클릭된 버튼으로 어떤 to-dos를 삭제 해야하는 지 알 수 있음.
3. Saving to-dos
-localstorage를 이용하여 todolist를 비우기 전에 이를 저장해보자.
✍ example
//javascript
function saveToDos(){
localStorage.setItem("todos", toDos);
}
- localStorage에 todos라는 키로 toDos의 배열에 있는 값들을 저장.
그러나 !! localstorage는 데이터베이스는 아님. toDos는 데이터베이스지만 localstorage는 toDos array를 복사해두는 곳임.
-그런데 만약 저장된 값을 string으로 바꾸고 저장된 string을 배열로 바꾸고 싶다면?
JSON.stringify()은 ()안에 적은 값은 string으로 변환.JSON.parse()은 ()안에 적은 값을 배열로 변환.
✔ 결과 확인

✍ example
//javascript
let TODOS_KEY="todos";
const saveToDo=localStorage.getItem(TODOS_KEY);
if(saveToDo!==null){
const parsedToDos=JSON.parse(saveToDo);
}
- localStorage에 저장한 값이 있다면 이를 배열로 바꿔줌.
forEach()
✍ example
//javascript
function sayHello(item){
console.log("say hello", item);
}
parsedToDos.forEach(sayHello);
- 배열은
forEach()라는 함수를 가지고 있는데 이는 배열의 각각의 원소마다 함수를 적용시켜주는 역할. forEach()에서 함수를 부를 때마다 인자로 배열의 원소를 함께 넘겨줌. (인자를 명시하지 않더라도!)parsedToDos.forEach(paintToDo)를 해주면parsedToDos에 있는 배열의 원소 하나씩이paintToDo()에넣어지면서 화면에 출력됨.
✔ 결과 확인

-todo를 정확하게 지우기 위해서는 todo에 id가 필요하다. 만약 같은 이름의 해야할 일이 2개가 있을수 있기 때문이다. 이 아이디는 todo가 입력된 시간으로 하자.
✍ example
//javascript
function handleToDoSubmit(event){
event.preventDefault();
const newTodo=todoInput.value;
console.log(todoInput.value="");
const newTodoObj={
text:newTodo,
id:Date.now(),
};
toDos.push(newTodoObj);
paintToDo(newTodoObj);
saveToDos();
}
Date.now()로 todo가 입력된 시간을 구할 수 있음.- todo와 id를 동시에 저장하기 위해서는 그냥 text를 push하는 것이 아니라 object를 push 해야함.
-id도 함께 추가해주었으면 id를 활용할 수 있다록 html에 넣어주어야 한다.
✍ example
//javascipt
function paintToDo(newTodo){
const li=document.createElement("li");// html에 li생성
li.id=newTodo.id;
}
paintToDo()에서 li의 id에 object의 id를 추가.
4. Deleting to-dos at localStorage
-만약 array에서 무언가를 삭제할 때 이건 실제로 array에서 무언가를 지우는 것이 아니다. 지우고 싶은 item을 빼고 새 array를 만드는 것을 통해 무언가를 삭제하는 행위를 구현할 수 있다.
filter()
✔ filter()는 forEach()와 비슷한 함수.
✔ [1, 2, 3, 4].filter(function)을쓰면 function에 1, 2, 3, 4, 각각의 원소마다 함수를 실행하는데 이 때, 각각의 원소를 인자로 보냄.
✔ filter()에서call하는 함수는 새 array에서 이 object를 유지하고 싶다면 true를 리턴해야함.
✔ false를 리턴하면 이 item은 새 array에 포함되지 않을것.
✔결과확인


✍ example
//javascript
function deleteTodo(event){
const li=event.target.parentElement;//button의 부모는 span
li.remove();
toDos=toDos.filter(toDo=>toDo.id!==parseInt(li.id));
saveToDos();
}
toDos=toDos.filter(toDo=>toDo.id!==parseInt(li.id))는 클릭한 li의 id가 아닌것만 true로 리턴. 즉 클릭한 li의 id는 false이므로 이를 제외하고 새로운 array를 만들 것!- 이 때 li.id는 string형이기 때문에 parseInt로 형변환을 해주어야함. 자료형이 같아야 비교가 가능하고 삭제가 가능해짐!
✔ 마치며
다음 포스팅에서는 css를 적용하여 구현한 to-do list app과 개발하면서 있었던 이슈들을 정리하고 마무리하겠습니다. 😊
Author And Source
이 문제에 관하여([Toy Project 1] 바닐라 js + HTML + CSS 이용한 Chrome Web 제작 06), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@chaeerim/Toy-Project-1-바닐라-js-HTML-CSS-이용한-Chrome-Web-제작-06저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)