본문 바로가기
개발공부/JavaScript

[바닐라 js로 크롬 앱만들기] 인강정리 (#7)

by dokii 2022. 4. 2.
728x90
반응형

목차

  1. todo리스트만들기
  2. todo리스트삭제기능
  3. 새로고침해도 todo리스트를 유지하고싶어 : 로컬스토리지
  4. 리스트가 덮어씌워지는걸 개선해보자
  5. 로컬스토리지 데이터 삭제하기

 


1. todo리스트 만들기

indext.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>replit</title>
    <link href="style.css" rel="stylesheet" type="text/css" />
  </head>
  <body>

    <h2 id="clock">00:00</h2>
    
	  <form id="login-form"  class="hidden">
     <input required maxlength="15" type="text" placeholder="What is your name?" /> 
       <button> Log in </button> <!--버튼대신 아래의 input으로 같은효과를--> 
      <input type="submit" value="Logggggg in" /> 
    </form>
    <h1 class="hidden" id="greeting"></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="food">
      <span>  </span>
      <span>  </span>
    </div>
    
    <script src="greetings.js"></script>
    <script src="clock.js"></script>
    <script src="foods.js"></script>
    <script src="todo.js"></script>
  </body>
</html>

required: 필수요소로 지정하기

const toDoForm = document.getElementById("todo-form");
const toDoList = document.getElementById("todo-list");
const toDoInput = document.querySelector("#todo-form input")

function paintToDo(newTodo) {
  const li = document.createElement("li");
  const span = document.createElement("span");
  li.appendChild(span);
  span.innerText = newTodo;
  //consle.log(li);
  toDoList.appendChild(li);
}

function handleToDoSubmit(event) {
  event.preventDefault();
  const newTodo = toDoInput.value;
  toDoInput.value= "";
  paintToDo(newTodo);
}
toDoForm.addEventListener("submit", handleToDoSubmit);

결과물

 

2. todo리스트의 목록을 삭제하는 기능추가

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>replit</title>
    <link href="style.css" rel="stylesheet" type="text/css" />
  </head>
  <body>

    
	  <form id="login-form"  class="hidden">
     <input required maxlength="15" type="text" placeholder="What is your name?" /> 
       <button> Log in </button> <!--버튼대신 아래의 input으로 같은효과를--> 
      <input type="submit" value="Logggggg in" /> 
    </form>

    <h2 id="clock">00:00</h2>
    
    <h1 class="hidden" id="greeting"></h1>
  
  
    
    

    <form id="todo-form">
      <input type="text" placeholder="write a To Do and Press Enter" required>
    </form>
    <ul id="todo-list"></ul>
      <li>
        <span>text</span>
        <button>X</button>
      </li>
    <div id="food">
      <span>  </span>
      <span>  </span>
    </div>
    <script src="greetings.js"></script>
    <script src="clock.js"></script>
    <script src="foods.js"></script>
    <script src="todo.js"></script>
  </body>
</html>

todo.js

const toDoForm = document.getElementById("todo-form");
const toDoList = document.getElementById("todo-list");
const toDoInput = document.querySelector("#todo-form input")

function deleteToDo(event) {
  const li = event.target.parentElement;
  li.remove();
}

function paintToDo(newTodo) {
  const li = document.createElement("li");
  const span = document.createElement("span");
   span.innerText = newTodo;
  const button = document.createElement("button");
  button.innerText="X";
  button.addEventListener("click", deleteToDo );
  
  li.appendChild(span);
  li.appendChild(button);
  //consle.log(li);
  toDoList.appendChild(li);
}

function handleToDoSubmit(event) {
  event.preventDefault();
  const newTodo = toDoInput.value;
  toDoInput.value= "";
  paintToDo(newTodo);
}
toDoForm.addEventListener("submit", handleToDoSubmit);

event.target.parentElement : 해당 엘리먼트의 부모를 타겟으로 지정한다. (여기서 버튼의부모 즉 li가 대상이된다.)

결과물

3. todo리스트의 페이지가 새로고침하면 없어지는걸 해결해보자 -> localStorage에 저장해보자.

- 로컬스토리지에는 array를 저장할수 없고, 오직 텍스트만 저장할수 있다.

- JSON.stringify(대상) : 어떤것이든 String으로 만들어드립니다!

- JSON.parse("String") : 어떤것이든 자바스크립트가 이해할수 있는 array로 만들어드립니다!

- 자바스크립트에서 item이라는걸 지원하는데, 배열의 각원소를 item으로 지정해서 무언가를 시킬수있다. 예를들어 forEach(item)을 호출할경우, 각 배열에담긴 원소들(item)을 한번씩 대입해서 돌려준다. 즉... for문을 실행시키는 느낌이랄까. 

- 아래의 두개는 같은코드다.

(item) => consloe.log("this is the turn of" , item)

function sayHello(item) {
	console.log("this is the turn of", item)
}

todo.js

const toDoForm = document.getElementById("todo-form");
const toDoList = document.getElementById("todo-list");
const toDoInput = document.querySelector("#todo-form input")

const TODOS_KEY = "todos";
const toDos =[];

function saveToDos() {
  localStorage.setItem("todos", JSON.stringify(toDos));
}

function deleteToDo(event) {
  const li = event.target.parentElement;
  li.remove();
}

function paintToDo(newTodo) {
  const li = document.createElement("li");
  const span = document.createElement("span");
   span.innerText = newTodo;
  const button = document.createElement("button");
  button.innerText="X";
  button.addEventListener("click", deleteToDo );
  
  li.appendChild(span);
  li.appendChild(button);
  //consle.log(li);
  toDoList.appendChild(li);
  
} 

function handleToDoSubmit(event) {
  event.preventDefault();
  const newTodo = toDoInput.value;
  toDoInput.value= "";

  toDos.push(newTodo);
  paintToDo(newTodo);
  saveToDos();
}
toDoForm.addEventListener("submit", handleToDoSubmit);

//String을 array로 바꾸어봅시다.
const savedToDos = localStorage.getItem(TODOS_KEY);
console.log("뭐가 들었냐면" + savedToDos);

if(savedToDos) {
  console.log("힝")
 const parsedToDos = JSON.parse(savedToDos);
  console.log("parsedToDos" +parsedToDos)
  //const a= 
  parsedToDos.forEach(paintToDo);
  //console.log(a);
//console.log("힛" + a)
}

-입력한 값을 로컬스토리지에 저장하는 const sacedToDos = localStorage.getItem(TODOS_KEY);

-로컬스트로리지에 저장한뒤 새로 고침할때 해당 정보를 리스트로 뿌려주며(불러오며)화면을 보여주도록하는

if(savedToDos) {
 const parsedToDos = JSON.parse(savedToDos);
  console.log("parsedToDos" +parsedToDos)
  parsedToDos.forEach(paintToDo); // 각 item(배월의 원소)들을 순서대로 대입해서 함수를 적용시킨다.
}

 

4. 새로고침한뒤 값을 추가하면 이전값(로컬스토리에 저장된)은 뿌려주지만, 새값들이 들어오면 이전 저장된값들위에 덮어써져 버리는문제를 해결해보자.

-상단 쪽 const toDos =[];에서 매번 로컬스토리지에 저장하는 배열이 초기화되는것이 이유다.

todo.js

const toDoForm = document.getElementById("todo-form");
const toDoList = document.getElementById("todo-list");
const toDoInput = document.querySelector("#todo-form input")

const TODOS_KEY = "todos";
//const toDos =[];
let toDos = []; //---------------수정----------------

function saveToDos() {
  localStorage.setItem("todos", JSON.stringify(toDos));
}

function deleteToDo(event) {
  const li = event.target.parentElement;
  li.remove();
}

function paintToDo(newTodo) {
  const li = document.createElement("li");
  const span = document.createElement("span");
   span.innerText = newTodo;
  const button = document.createElement("button");
  button.innerText="X";
  button.addEventListener("click", deleteToDo );
  
  li.appendChild(span);
  li.appendChild(button);
  //consle.log(li);
  toDoList.appendChild(li);
  
} 

function handleToDoSubmit(event) {
  event.preventDefault();
  const newTodo = toDoInput.value;
  toDoInput.value= "";

  toDos.push(newTodo);
  paintToDo(newTodo);
  saveToDos();
}
toDoForm.addEventListener("submit", handleToDoSubmit);

//String을 array로 바꾸어봅시다.
const savedToDos = localStorage.getItem(TODOS_KEY);
console.log("뭐가 들었냐면" + savedToDos);

if(savedToDos) {
 const parsedToDos = JSON.parse(savedToDos);
 toDos = parsedToDos; //---------------추가----------------
 parsedToDos.forEach(paintToDo);

}

5. 이번에는 x버튼을 눌러 삭제했을때 스토리지에서도 삭제해보자.

-이전에 만들었던 모양은,, 어떤요소가 어떤건지 알아보기 힘들다. 예를들어 같은 텍스트가 2개존재한다면? 두개를 구별할수 있을까?

- 그래서 요소마다 특별한 id를 주고싶다!

- element가 만들어질때마다 id를 줘보자. 

- filter함수 : array가 가진요소를 모두 대입해서 함수를 돌리되, true를 반환하면 유지하rh false라면 그 요소는 제외된다.

- 버튼을눌러 해당 요소의 id를 가진애는 제외하고 새롭게 array를 만들고 새로운 배열을 저장하는 식으로 삭제함수를 수정할것이다.

todo.js

const toDoForm = document.getElementById("todo-form");
const toDoList = document.getElementById("todo-list");
const toDoInput = document.querySelector("#todo-form input")

const TODOS_KEY = "todos";
//const toDos =[];
let toDos = [];

function saveToDos() {
  localStorage.setItem(TODOS_KEY, JSON.stringify(toDos));
}

function deleteToDo(event) {
  const li = event.target.parentElement;
  li.remove();
  console.log("tttttt:  " + li.id);
  
  console.log(typeof(li.id)); //타입이 String이다. 따라서 parseInt로 int타입으로 바꾸어주자.
  toDos = toDos.filter((toDo)=> toDo.id !== parseInt(li.id)); //--추가코드--
  //위의 코드는 아래와 같다.
  // function ye(toDo) { retrun toDo !== li.id}
  
  saveToDos();//--추가코드--
  
  //console.log(toDos);
  
  
 
}

function paintToDo(newTodo) {
  const li = document.createElement("li");
  li.id = newTodo.id;
  const span = document.createElement("span");
   span.innerText = newTodo.text;
  const button = document.createElement("button");
  button.innerText="X";
  button.addEventListener("click", deleteToDo );
  
  li.appendChild(span);
  li.appendChild(button);
  //consle.log(li);
  toDoList.appendChild(li);
  
} 

function handleToDoSubmit(event) {
  event.preventDefault();
  const newTodo = toDoInput.value;
  toDoInput.value= "";

  //toDos.push(newTodo);
  const newTodoObj = {
    text : newTodo,
    id: Date.now(),//요소가만들어질때의 시간
  }
  toDos.push(newTodoObj);
  paintToDo(newTodoObj);
  saveToDos();
}
toDoForm.addEventListener("submit", handleToDoSubmit);

//String을 array로 바꾸어봅시다.
const savedToDos = localStorage.getItem(TODOS_KEY);
console.log("뭐가 들었냐면" + savedToDos);

if(savedToDos) {
 const parsedToDos = JSON.parse(savedToDos);
 toDos = parsedToDos;
 parsedToDos.forEach(paintToDo);//가진 요소마다 대입해서돌림

}
//filter함수 : array가 가진요소를 모두 대입해서 함수를 돌리되, true를 반환하면 유지하고 false라면 그 요소는 제외된다.
const toDoForm = document.getElementById("todo-form");
const toDoList = document.getElementById("todo-list");
const toDoInput = document.querySelector("#todo-form input")

const TODOS_KEY = "todos";
//const toDos =[];
let toDos = [];

function saveToDos() {
  localStorage.setItem(TODOS_KEY, JSON.stringify(toDos));
}

function deleteToDo(event) {
  const li = event.target.parentElement;
  li.remove();
  console.log("tttttt:  " + li.id);

  console.log(typeof(li.id));
  toDos = toDos.filter((toDo)=> toDo.id !== parseInt(li.id));//----추가---
  saveToDos();
  
  //console.log(toDos);
  
  //위의 코드는 아래와 같다.
  // function ye(toDo) { retrun toDo !== li.id}
 
}

function paintToDo(newTodo) {
  const li = document.createElement("li");
  li.id = newTodo.id;
  const span = document.createElement("span");
   span.innerText = newTodo.text;
  const button = document.createElement("button");
  button.innerText="X";
  button.addEventListener("click", deleteToDo );
  
  li.appendChild(span);
  li.appendChild(button);
  //consle.log(li);
  toDoList.appendChild(li);
  
} 

function handleToDoSubmit(event) {
  event.preventDefault();
  const newTodo = toDoInput.value;
  toDoInput.value= "";

  //toDos.push(newTodo);
  const newTodoObj = {
    text : newTodo,
    id: Date.now(),//요소가만들어질때의 시간 ----추가---
  }
  toDos.push(newTodoObj);
  paintToDo(newTodoObj);
  saveToDos();
}
toDoForm.addEventListener("submit", handleToDoSubmit);

//String을 array로 바꾸어봅시다.
const savedToDos = localStorage.getItem(TODOS_KEY);
console.log("뭐가 들었냐면" + savedToDos);

if(savedToDos) {
 const parsedToDos = JSON.parse(savedToDos);
 toDos = parsedToDos;
 parsedToDos.forEach(paintToDo);//가진 요소마다 대입해서돌림 -------

}
//filter함수 : array가 가진요소를 모두 대입해서 함수를 돌리되, true를 반환하면 유지하고 false라면 그 요소는 제외된다.
728x90
반응형

댓글