일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 코딩테스트 고득점 Kit 완전탐색
- React JS
- react hook
- 프로그래머스
- 자바스크립트
- react
- 컴퓨터 네트워크
- 리액트
- websocket
- 백준
- codesandbox
- Java
- design pattern
- useState
- 디자인 패턴
- 리액트 훅
- 장고
- 자바 공부
- NextJS
- 데이터모델링과마이닝
- 코틀린
- 프로그래밍 언어론
- react firebase
- 프로그래머스 완전탐색
- JavaScript
- 프로그래머스 자바
- useEffect
- 자바
- 코딩테스트 고득점 Kit
- vanillaJS
- Today
- Total
기록하는 개발자
[VanillaJS] Google Chrome App Momentum 만들기 - 4-1. Checklist Load 본문
[VanillaJS] Google Chrome App Momentum 만들기 - 4-1. Checklist Load
밍맹030 2021. 8. 4. 17:52Checklist Load 구현
- list를 입력 받아 localStorage에 저장한다.
- 새로고침 후에도 localStorage로부터 이전에 저장한 value를 load해서 list를 유지할 수 있다.
- 이전 정보 load 후 추가로 list를 입력 받을 때 덮어쓰기 되지 않고 기존 list에 추가되도록 한다.
< HTML >
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet", href="css/style.css">
<title>Momentum</title>
</head>
<body>
<!--input의 유효성 검사를 작동시키기 위해서는 form 태그를 사용해야한다.-->
<form class="hidden" id="login-form">
<input required maxlength="15" type="text" placeholder="What is your name?">
<button>Log in</button>
</form>
<h2 id="clock"> 00:00:00</h2>
<h1 class="hidden" id="greeting"></h1> <br>
<form id="todo-form">
<input required type="text" placeholder="Write a To Do and Press Enter.">
</form>
<!--js로 리스트를 추가할 부분-->
<ul id="todo-list"></ul>
<div id="quote">
<span></span>
<span></span>
</div>
<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>
</body>
</html>
< todo.js >
const toDoForm = document.getElementById("todo-form");
const toDoList = document.getElementById("todo-list");
const toDoInput = toDoForm.querySelector("input");
let toDos=[];
const TODOS_KEY = "todos";
function handleToDoSubmit(event){
event.preventDefault();
const newToDo =toDoInput.value;
toDoInput.value="";
toDos.push(newToDo);
paintToDo(newToDo);
saveToDos();
}
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);
}
function deleteToDo(event){
const li =event.target.parentElement;
li.remove();
}
function saveToDos(){
localStorage.setItem(TODOS_KEY, JSON.stringify(toDos));
}
toDoForm.addEventListener("submit", handleToDoSubmit)
const savedToDos=localStorage.getItem(TODOS_KEY);
if(savedToDos !==null ){
const parsedToDos = JSON.parse(savedToDos);
toDos = parsedToDos;
parsedToDos.forEach(paintToDo);
}
< 변수 선언 >
const toDoForm = document.getElementById("todo-form");
const toDoList = document.getElementById("todo-list");
const toDoInput = toDoForm.querySelector("input");
let toDos=[];
const TODOS_KEY = "todos";
배열 toDos : 새로운 todo가 input될 때마다 해당 text를 push하는 용도. 배열이 수정 가능하도록 let으로 선언한다.
TODOS_KEY : 두 번 이상 사용되는 문자열은 변수로 미리 선언해둔다.
< function : handleToDoSubmit >
function handleToDoSubmit(event){
event.preventDefault();
const newToDo =toDoInput.value;
toDoInput.value="";
toDos.push(newToDo);
paintToDo(newToDo);
saveToDos();
}
- 새로고침 없이도 list 입력 후 enter를 누르면 form이 빈칸이 되도록 한다.
→ 입력한 내용을 newToDo에 임시로 저장하고 toDoInput을 ""로 대체한다.
- 배열에 newToDo를 저장한다.
- paintToDo(newToDo) 를 호출한다.
- saveToDos() 를 호출한다.
< function : paintToDo > : list가 추가 되면 li, span, button 태그를 생성 해 html에 추가한다.
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);
}
- createElement 함수를 이용해 li 태그를 생성한다.
- createElement 함수를 이용해 span 태그를 생성하고 innerText를 input으로 받은 text인 newToDo로 지정한다.
- createElement 함수를 이용해 button 태그를 생성하고 innerText를 "❌" 아이콘으로 지정한다.
- button 클릭을 통해 list를 삭제하기 위해 deleteToDo 함수를 가진 eventlistener를 추가한다.
- 생성된 태그에 필요한 모든 기능을 추가한 후, appendChild는 맨 마지막에 수행한다.
1. li의 child로 span 추가
2. li의 child로 button 추가
3. ul(toDoList)의 child로 li 추가
< function : deleteToDo > : list 에서 원하는 항목 삭제 (localStorage에서는 삭제되는 버전 아직 아님)
function deleteToDo(event){
const li =event.target.parentElement;
li.remove();
}
어떤 버튼이 클릭되었는가? -> event에 대한 정보를 console.dir()를 통해 찾아 낸다.
console.dir(event);
→ target : button
console.dir(event.target);
→ parentNode, parendElement : button의 부모 요소
console.dir(event.target.parendElement);
→ button의 부모 요소 : li
따라서 버튼 클릭을 통해 선택한 요소를 삭제하기 위해서는 button의 부모요소 li를 삭제한다.
< function : saveToDos > : input을 실행 할 때 마다 localStorage에 toDos 배열의 내용 넣기
function saveToDos(){
localStorage.setItem(TODOS_KEY, JSON.stringify(toDos));
}
- 배열 toDos를 localStorage에 배열 모양 그대로 문자열화 하여 추가해주기 위해 JSON.stringify() 함수를 사용한다.
JSON.stringify(arr)) → 배열 arr을 string 화 해준다.
ex) JSON.stringify(["1","2","3","4"])) → "["1","2","3","4"]"
< 함수 실행 부 >
toDoForm.addEventListener("submit", handleToDoSubmit)
const savedToDos=localStorage.getItem(TODOS_KEY);
if(savedToDos !==null ){
const parsedToDos = JSON.parse(savedToDos);
toDos = parsedToDos;
parsedToDos.forEach(paintToDo);
}
- toDoForm 에 handleToDoSubmit 함수를 가진 eventlistener를 추가한다.
- 변수 savedToDos 에 localStorage에서 "todos" 를 가져와 저장한다.
< if문 >
- 저장된 savedToDos 이 있는 경우에만 JSON.parse() 함수를 이용해
string으로 저장한 배열을 객체화하여 다시 배열로 받아오고, parsedToDos에 저장한다.
- 새로고침 후 list를 추가하는 경우 덮어쓰기 방지를 위해 toDos 배열에 기존 localStorage에 저장되어있던 list 정보를 업로드 한다.
- parsedToDos의 각 요소에 대해 paintToDo 함수를 호출한다.
JSON.parse(arr)) → 단순 string을 객체화 해준다.
ex) JSON.parse("["1","2","3","4"]") → ["1","2","3","4"]
< 일반 함수 선언과 arrow 함수 선언 방법 >
<function>
functions sayHello(item){
console.log("this is the turn of", item);
}
parsedToDos.forEach(item);
<arrow function>
parsedToDos.forEach((item)=>console.log("this is the turn of", item));
arrow 함수 선언 시 장점
- 함수 이름을 사용하지 않아도 된다.
- 짧은 함수를 작성할 수 있게 되며 call back 함수 작성시 유용하다.
그러나 남용하지는 않기로 하자,,
'Web > Javascript' 카테고리의 다른 글
[VanillaJS] Google Chrome App Momentum 만들기 - 5. weather (0) | 2021.08.06 |
---|---|
[VanillaJS] Google Chrome App Momentum 만들기 - 4-2. Checklist Delete (0) | 2021.08.05 |
[VanillaJS] Google Chrome App Momentum 만들기 - 3-2. Random Background Image (0) | 2021.08.03 |
[VanillaJS] Google Chrome App Momentum 만들기 - 3-1. Random Quotes (0) | 2021.08.03 |
[VanillaJS] Google Chrome App Momentum 만들기 - 2. Clock (0) | 2021.08.03 |