9. 장바구니 기능 만들기
상태
장바구니 버튼을 누르면 상품명이 배열 형태로 localStorage에 저장되고 cart.html이 별도로 생성되어 html로 상품이 유통된다.
기본 코드
<div class="container">
<div class="row">
</div>
</div>
let products = (
{ id : 0, price : 70000, title : 'Blossom Dress' },
{ id : 1, price : 50000, title : 'Springfield Shirt' },
{ id : 2, price : 60000, title : 'Black Monastery' }
);
let cardWrap = document.querySelector('.row');
products.forEach(function(a, i){
let card = `<div class="col-sm-4">
<img src="https://via.placeholder.com/600" class="w-100">
<h5>${products(i)('title')}</h5>
<p>${products(i)('price')}</p>
<button class="btn-cart">장바구니</button>
</div>`
cardWrap.insertAdjacentHTML('beforeend', card);
});
설명
// 여러개의 장바구니 버튼들을 buttonCarts 변수로 선언
let buttonCarts = document.querySelectorAll('.btn-cart');
// buttonCarts 안의 각각의 buttonCart elements들에게 함수를 실행
buttonCarts.forEach(function(buttonCart){
// buttonCart를 클릭하면..
buttonCart.addEventListener('click', function(){
// localStorage의 cart를 key로 가진 데이터들을 titArray 변수로 선언
let titArray = localStorage.getItem('cart');
// 만약 titArray가 비었으면 (= 처음 장바구니버튼을 눌렀다면)
if (titArray === null){
// 빈 배열로 만들자!
titArray = ();
// 만약 비어있지 않다면
} else {
// JSON을 parse해와서 다시 배열 형태로 만들자!
titArray = JSON.parse(titArray);
}
// 그리고 titArray 배열에 buttonCart 이전 이전 태그 안의 텍스트를 마지막에 push!
titArray.push(buttonCart.previousElementSibling.previousElementSibling.textContent);
// localStorage에 다시 key: cart, value: titArray인 데이터를 집어넣는다.
localStorage.setItem('cart', JSON.stringify(titArray));
});
})
cart.html
<div class="container">
<div class="row">
</div>
</div>
// row div를 cardWrap 변수로 선언
let cardWrap = document.querySelector('.row');
// localStorage에 있는 cart가 key인 데이터들을 getTit 변수로 선언
let getTit = localStorage.getItem('cart');
// getTit의 JSON형 데이터를 parse해와 배열로 변환
getTit = JSON.parse(getTit);
// getTit 안의 element들에 함수를 실행하는데..
getTit.forEach(function(a, i){
//getTit의 데이터 0부터 끝까지 뿌려주기 위해 ${getTit(i)}를 넣어 card 변수로 선언
let card = `<div class="col-sm-4">
<img src="https://via.placeholder.com/600" class="w-100">
<h5>${getTit(i)}</h5>
</div>`
// 그런 card를 cardWrap 안쪽 끝부분에 insertAdjacentHTML로 삽입
cardWrap.insertAdjacentHTML('beforeend', card);
});
내가 배운 것
- 페이지를 새로고침할 때마다 변수가 재설정되기 때문에 페이지를 새로고침하거나 이동하더라도 저장된 데이터를 저장하기에는 적합하지 않습니다.
(그래서 실전에서는 서버를 사용하지만 localStorage는 사용하지 않습니다( - 텍스트 내용HTML 태그를 제거하고 텍스트만 반환하지만, innerHTML태그를 문자열로 반환하다.
- 배열이 처음으로 비어 있는 경우 if 문을 사용하여 배열을 null로 처리할 수 있습니다.