로컬스토리지의 활용법과 이벤트 위임이라는 굉장히 유용한 기능을 배울 수 있는 챕터였다. (어려웠지만….. ㅋㅋ)
 
물론 mongoDB와 같은 DB를 사용하면 크게 사용할 일은 없겠지만, 간단한 웹서비스 등을 만들 때에는 유용할 것 같다.
 
 
로직 
사용할 객체들 변수화 하기 (const) + 이벤트리스너와 함수 생성 
<input>에입력한 값을 인식할 수 있도록 함수 설정 
add item(submit)을 누르면  가 append! 
append된 요소들이 로컬스토리지에 저장 되도록 설정 
체크박스의 체크 유무 또한 로컬 스토리지에 저장 되도록 설정 (위임도 필요) 
삭제 기능 추가 
 
 
const 선언 
💡 Add item버튼, html에 추가될 아이템 ul, 아이템 배열을 생성하여 변수화해준다.
 
1 2 3 const  addItems = document .querySelector('.add-items' );const  itemsList = document .querySelector('.plates' );const  items = [];
 
 
addEventListener 1 2 3 4 5 6 7 function  addItem (e )  {  e.preventDefault();      console .log('hi' ); } addItems.addEventListener('submit' , addItem); 
 
event.preventDefault() 
💡 페이지의 이동 또는 리로드가 실행되지 않도록 막아준다!
 
⇒ 이 챕터에선 submit을 눌러도 페이지가 새로고침되지 않고 submit만 될 수 있도록  하기 위해 사용
 
💡 <input> 에 입력한 값이 잘 불러와질 수 있도록 addItem 함수를 수정보완
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 function  addItem (e )  {  e.preventDefault();      text = this .querySelector('[name=item]' ).value;      item = {     text : text,     done : false ,   };      console .log(item);    } 
 
 
미리 생성한 배열인 items에 item을 push! 1 2 3 4 5 6 7 8 9 function  addItem (e )  {  e.preventDefault();   text = this .querySelector('[name=item]' ).value;   const  item = {     text : text,     done : false ,   };   items.push(item); } 
 
setItem()
💡 로컬스토리지 객체에 접근하여 항목 하나를 추가한다
 
⭐️JSON.stringify()⭐️ 
💡 JavaScript값이나 객체를 JSON형태의 문자열로 변환한다.
 
(배열 자체가 문자열이 되어 반환된다고 생각하면 편할듯?) 
1 2 console .log(JSON .stringify({ x : 5 , y : 6  }));
 
 
버튼 누르면 → 아이템(<li>) append! 
💡 우선 appendList라는 함수를 생성해주자.
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 function  appendList (plates = [], platesList )  {  platesList.innerHTML = plates     .map((plate, i ) =>  {       return  `  			<li> 				<input type="checkbox" data-index=${i}  id="item${i} " ${          plate.done ? 'checked'  : ''        }  />				<label for="item${i} ">${plate.text} </label> 			</li> 		` ;    })     .join('' );  } 
 
 
localStorage getItem()
💡 로컬스토리지 내에서 항목을 읽어냄
 
⭐️JSON.parse()⭐️ 
💡 문자열로 구성된 JSON을 JavaScript값이나 객체로 반환한다.
 
문자열 → JavaScript 객체 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 const  items = JSON .parse(localStorage .getItem('items' )) || [];function  addItem (e )  {  e.preventDefault();      const  text = this .querySelector('[name=item]' ).value;   const  item = {     text : text,          done : false ,   };   items.push(item);   populateList(items, itemsList);   localStorage .setItem('items' , JSON .stringify(items));   this .reset(); } 
 
 
체크 유무 저장 
💡 위의 items 객체에서 설정한 done의 boolean값을 저장하여 체크박스의 체크 유무를 새로고침해도 유지될 수 있도록 설정
 
1 2 3 4 5 6 7 8 function  toggleDone (e )  {  if  (!e.target.matches('input' )) return ;    const  el = e.target;   const  index = el.dataset.index;   items[index].done = !items[index].done;    localStorage .setItem('items' , JSON .stringify(items));   appendList(items, itemsList); } 
 
 
삭제기능 추가 
💡 wrapper 하단에 Clear All 버튼을 만들어 준 뒤,
 
localStorage.removeItem() 을 사용해서 삭제기능을 구현하면 된다.
removeItem()
💡 로컬 스토리지에서 항목 하나를 제거한다.
 
1 2 3 4 5 6 7 8 9 10 11 const  clear = document .querySelector('.clear' );function  removeAll ( )  {  localStorage .removeItem('items' );      location.reload(); } clear.addEventListener('click' , removeAll); 
 
 
최종 코드 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 const  addItems = document .querySelector('.add-items' );const  itemsList = document .querySelector('.plates' );const  clear = document .querySelector('.clear' );const  items = JSON .parse(localStorage .getItem('items' )) || [];function  addItem (e )  {  e.preventDefault();   text = this .querySelector('[name=item]' ).value;   const  item = {     text : text,     done : false ,   };   items.push(item);   appendList(items, itemsList);   localStorage .setItem('items' , JSON .stringify(items));   this .reset(); } function  appendList (plates = [], plateList )  {  plateList.innerHTML = plates     .map((plate, i ) =>  {       return  `              <li>                 <input type="checkbox" data-index=${i}  id="items${i} " ${          plate.done ? 'checked'  : ''        } />                <label for="items${i} ">${plate.text} </label>             </li>         ` ;    })     .join('' ); } function  toggleDone (e )  {  if  (!e.target.matches('input' )) return ;    const  el = e.target;   const  index = el.dataset.index;   items[index].done = !items[index].done;   localStorage .setItem('items' , JSON .stringify(items));   appendList(items, itemsList); } function  removeAll ( )  {  localStorage .removeItem('items' );   location.reload(); } clear.addEventListener('click' , removeAll); addItems.addEventListener('submit' , addItem); itemsList.addEventListener('click' , toggleDone); appendList(items, itemsList);