[JavaScript] JS로 크롬 만들기 11. HTML element Save & Load: localStorage & stringify & parse

작성:    

업데이트:

카테고리:

태그: , ,

HTML element 저장

문제 상황 : 브라우저를 새로고침할 때마다 to do list가 초기화된다.

해결 : localStorage에 저장!!


저장용 array 제작

const toDos = [];

function handleToDoSubmit(event) {
  ...
  saveToDos();                       // Submit되면 ToDos를 저장하는 saveToDos 함수 호출
}

function saveToDos() {
  localStorage.setItem("todos", toDos);    // localStorage에 todos라는 이름으로 toDos array 저장
}


localStorage와 array

문제 상황 : localStorage에는 array 형태로는 저장할 수 없고 text만 저장할 수 있다.

해결 : 아예 처음부터 string으로 변형해서 집어넣자!

추후 계획 : 나중에 string을 JSON으로 바꿔 재가공한다!


JSON.stringify(obj, arr…)

  • JS object나 array 또는 어떤 JS 코드든 string으로 만들어준다.
  • JSON.stringify(??)의 ?? 내에 원하는 어떠한 코드든 넣어준다.
JSON.stringify([1,2,3,4])

// '[1,2,3,4]'
  • array나 object를 stringify 괄호 내에 넣으면 그 자체를 string으로 저장한다.
  • 정확히는 localStorage에 저장할 수 있는 JSON 형태로 저장하는 것이다.


function saveToDos() {
  localStorage.setItem("todos", JSON.stringify(toDos));    // localStorage에 todos라는 이름으로 toDos array 저장
}


전후 결과

stringify 이전

image


stringify 이후

image

  • localStorage.getIem(‘todos’)로 조회를 해보면 둘 다 string으로 출력된다.
  • toDos를 stringify를 한 쪽이 array 자체의 form을 더 유지하고 있음을 알 수 있다.
  • 이는 JSON 형태로, 이후에 parse를 거쳐 다시 JS 객체/배열로 데이터를 처리할 수 있는 형태이다.
  • 하위에 배열처럼 보이는 것은 브라우저 자체적으로 JSON을 parsing해서 보여주는 기능 때문이고 localStorage 자체에는 JSON(string) 형태로 저장됨에 주의한다.


HTML element 로드

문제 상황 : localStorage에 stringify해서 넣어 사용할 수 없다.

해결 : JSON.parse()로 JSON으로 되살려보자.


JSON.parse(str)

localStorage.getItem('todos')
// '["a","b","c"]'

JSON.parse(localStorage.getItem('todos'))
// (3) ['a', 'b', 'c']

string화 되어있던 array나 object를 읽을 수 있는 배열이나 객체의 형태로 재현


forEach()

  • array의 각 item에 대해 function을 실행할 수 있게 한다.
  • array.forEach(function) 형태로 사용


arrow function

  • 익명함수
  • forEach 등의 함수에서 function 자리에 쓸 수 있는 이름 없는 함수
array.forEach((element) => {
  console.log(`Hello, ${element}`!)
})


전체 코드

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

const TODOS_KEY = "todos"
let toDos = [];             // 초기에는 빈 array, 그리고 바꿀 수 있도록 let 설정

function saveToDos() {
  localStorage.setItem(TODOS_KEY, JSON.stringify(toDos));    // localStorage에 todos라는 이름으로 toDos array 저장
}

function deleteToDo(event) {
  const li = event.target.parentElement;             // 삭제해야 하는 li를 parentElement를 이용해 조회/저장
  li.remove();                                       // parentElement 제거 
}

function paintToDo(newTodo) {
  // li와 span 정의
  const li =  document.createElement("li");          // document에 li 만들기
  const span = document.createElement("span");       // document에 span 만들기       
  span.innerText = newTodo;                          // span에 newTodo text 넣기

  // button 정의
  const button = document.createElement("button");   // document에 button 만들기
  button.innerText = "";                          // button에 'X' 표시 text 넣기
  button.addEventListener("click", deleteToDo);      // button클릭 시 deleteToDo 함수 실행

  // span, button을 li에, li를 toDoList에 넣기
  li.appendChild(span);                              // li에 span을 넣기
  li.appendChild(button);                            // li에 button 넣기
  toDoList.appendChild(li);                          // toDoList ul에 li 넣기
}

function handleToDoSubmit(event) {
  event.preventDefault();            // 기본동작 제거
  const newTodo = toDoInput.value;   // 입력값을 newTodo에 저장
  toDoInput.value = "";              // 입력공간 값 제거
  toDos.push(newTodo);               // toDos array에 newTodo 추가
  paintToDo(newTodo);                // 입력값을 처리
  saveToDos();                       // Submit되면 ToDos를 저장하는 saveToDos 함수 호출
}

toDoForm.addEventListener("submit", handleToDoSubmit);

function sayHello(item){                             // JS는 자동으로 item이라는 parameter 추가
  console.log('this is the turn of', item);
}

const savedToDos = localStorage.getItem(TODOS_KEY);  // localStorage의 toDos를 가져와 savedToDos에 저장

if (savedToDos) {                                    // savedToDos에 item이 있다면
  const parsedToDos = JSON.parse(savedToDos);        // parse한 것을 parsedToDos에 저장하고
  toDos = parsedToDos;                               // toDos에 parsedToDos를 저장
  parsedToDos.forEach(paintToDo);                    // 이 각각의 item에 paintToDo 함수 적용
}

댓글남기기