All'alba vincerò

At dawn, I will win!

Javascript/Coding Apple

[Coding Apple] 장바구니 기능 / local Storage

나디아 Nadia 2024. 3. 6. 19:29

 

 

local Storage

 

 

데이터를 반영구적으로 저장하기

  • 브라우저 안에 몰래 데이터 저장 가능
  • Local Storage : [키 : 값] 형태로 데이터 저장 (반영구)
  • Session Storage : [키 : 값] 형태로 데이터 저장 (일회용)
  • IndexedDB : 구조화 된 대용량 데이터 저장
  • Cookies : 유저의 로그인 정보 저장
  • Cache Storage : html, css, js, img 파일 저장해두는 공간

 

 

 

 

local Storage

 

  • [이름 : 값] 형태로 저장 가능
  • 5MB의 문자/숫자만 저장 가능

 

* 차이점!
Local Storage = 사이트 재접속해도 유지 (반영구)
Session Storage = 사이트 나가면 자동 삭제 (일회용)

 

 

 

local Storage에 데이터 저장하기

localStorage.setItem('키', '값');

 

 

데이터 출력하기

localStorage.getItem('키');
  • 코드 자리에 키의 '값'이 출력됨

 

데이터 삭제하기

localStorage.removeItem('키');

 

 

(배열에) 데이터 추가하기

cartItems.push('값');

 

 

 

 

Local Storage에 배열(array, object) 저장하기

  • 원래는 배열 저장 불가능
localStorage.setItem('num', [1, 2, 3]);
// array가 깨져서 저장됨 (그냥 1, 2, 3으로 저장됨)
  • array / object → JSON으로 바꾸면 저장 가능
    - 문자열로 바꾸기

 

 

* 코드 → JSON 파일로 변환하기

  • JSON.stringify(array 변수);
var arr = [1, 2, 3];
var newArr = JSON.stringify(arr);

localStorage.setItem('num', newArr);

 

 

 

 

Local Storage에서 배열(array, object) 꺼내기

  • JSON 형태로 나옴

 

* JSON 파일 → 코드로 변환하기

  • JSON.parse(array 변수)[index];
    - 인덱스로 꺼내기 가능 (선택)
var get = localStorage.getItem('num');

console.log(JSON.parse(get)[0]); 
// 인덱스로 꺼내기 가능

 

 

 

Local Storage 데이터 수정하기

  1. 수정하려는 데이터 꺼내기
  2. 데이터 수정하기
  3. 다시 데이터 넣기

 

sessionStorage 사용법

  • local을 다 session으로 바꾸기

 

 


 

장바구니 기능

 

구현 계획 

1. 구매 버튼 누르면 상품명을 local Storage에 저장

 

1. 클릭한 요소의 상품명(전전 형제 요소의 내용)을 가져온다.

  • e.target : 특정 이벤트가 발생하는 태그
  • .previousElementSibling : 해당 요소의 이전 형제 요소 가져오기
  • .innerHTML : 요소의 내용

2. 로컬 스토리지에서 현재 장바구니(cart)를 가져온다. 

  • 2-1. 만약 로컬 스토리지에 장바구니가 없다면 빈 배열[ ]을 설정한다.
    let cartItems = JSON.parse(localStorage.getItem('cart')) || [ ];

3. 장바구니에 클릭한 상품명이 있는지 확인한다.

  • 3-1. 상품명이 없을 경우
    .includes( ) : 배열에 특정 값이 포함되어 있는지 여부 확인하기 (boolean형)

    (1) 장바구니에 상품을 추가한다.
    (2) 수정된 장바구니 정보를 다시 로컬 스토리지에 저장한다.
for (let i = 0; i < 3; i++) {

    document.querySelectorAll('.buy')[i].addEventListener('click', function(e) {
    
        // 1. 클릭한 요소의 상품명(전전 형제 요소의 내용)을 가져온다.
        let title = e.target.previousElementSibling.previousElementSibling.innerHTML;
        
        // 2. 로컬 스토리지에서 현재 장바구니(cart)를 가져온다. 
        // 2-1. 만약 로컬 스토리지에 'cart'가 없다면 빈 배열[]을 설정한다.
        let cartItems = JSON.parse(localStorage.getItem('cart')) || [];
        
        // 3. 장바구니에 클릭한 상품명이 있는지 확인한다.
        // 3-1. 상품명이 없을 경우
        if (!cartItems.includes(title)) {
        
            // (1) 장바구니에 상품을 추가한다.
            cartItems.push(title);
            
            // (2) 수정된 장바구니 정보를 다시 로컬 스토리지에 저장한다.
            localStorage.setItem('cart', JSON.stringify(cartItems));
        
        // 3-2. 있을 경우
        } else {
            console.log(title + " is already in the cart.");
        }
    });
}

 

 

 

2. local Storage에서 장바구니를 가져와 화면에 출력하기

1. 로컬 스토리지에서 장바구니 상품들을 가져와 화면에 출력한다.

  • 1-1. 만약 장바구니가 없다면 빈 배열[ ]로 설정한다.

2. 가져온 장바구니 상품 목록 배열을 순회한다.

  • 2-1. 상품명을 출력할 <li> 태그를 생성한다.
    .createElement( )
  • 2-2. <li> 태그의 내용으로 장바구니 목록들을 할당한다.
    .textContent : 요소에 텍스트 추가
  • 2-3. <ul> 태그 안에 장바구니 목록을 담은 <li> 태그를 추가한다.
    .appendChild( ) : 부모 태그에 자식 태그를 추가
<body>
    <h2>장바구니 상품 목록</h2>
    <ul id="cartItems"></ul>

    <script>
        // 1. 로컬 스토리지에서 장바구니 상품들을 가져와 화면에 출력한다.
        // 1-1. 만약 장바구니가 없다면 빈 배열[ ]로 설정한다.
        let cartItems = JSON.parse(localStorage.getItem('cart')) || [];
        let cartList = document.getElementById('cartItems');

		// 2. 가져온 장바구니 상품 목록 배열을 순회한다.
        cartItems.forEach(function(item) { // item은 순회할 장바구니 상품 목록
        	// 2-1. 상품명을 출력할 <li> 태그를 생성한다.
            let listItem = document.createElement('li');
            
            // 2-2. <li> 태그의 내용으로 장바구니 목록들을 할당한다.
            listItem.textContent = item;
            
            // 2-3. <ul> 태그 안에 장바구니 목록을 담은 <li> 태그를 추가한다.
            cartList.appendChild(listItem);
        });
    </script>
</body>

 

 

 

 

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <!-- Bootstrap CSS -->
      <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"
      rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous"/>
  </head>
  <body>
    
    <div class="container">
      <div class="row">
      </div>
    </div> 
    <div class="container my-3">
      <button class="btn btn-danger" id="price">가격순 정렬</button>
    </div>
    <div class="container my-3">
        <button class="btn btn-danger" id="sort1">다나가순 정렬</button>
      </div>
      <div class="container my-3">
        <button class="btn btn-danger" id="filter">6만원 이하</button>
      </div>
    <div class="container">
        <button class="btn btn-danger" id="more">더보기</button>
    </div>

    <script src="index.js"></script>
  </body>
</html>

 

 

index.js

var products = [
    { id : 0, price : 80000, title : 'Blossom Dress' },
    { id : 1, price : 50000, title : 'Spring Shirt' },
    { id : 2, price : 60000, title : 'Black pants' }
];

// 상품마다 구매 버튼 추가
products.forEach((a, i) => {
    var a = 
        `<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="buy">구매</button> 
        </div>`;

    document.querySelector('.row').insertAdjacentHTML('beforeend', a);
});


// 장바구니 기능
for (let i = 0; i < 3; i++) {

    document.querySelectorAll('.buy')[i].addEventListener('click', function(e) {
    
        // 1. 클릭한 요소의 상품명(전전 형제 요소의 내용)을 가져온다.
        let title = e.target.previousElementSibling.previousElementSibling.innerHTML;
        
        // 2. 로컬 스토리지에서 현재 장바구니(cart)를 가져온다. 
        // 2-1. 만약 로컬 스토리지에 'cart'가 없다면 빈 배열[]을 설정한다.
        let cartItems = JSON.parse(localStorage.getItem('cart')) || [];
        
        // 3. 장바구니에 클릭한 상품명이 있는지 확인한다.
        // 3-1. 상품명이 없을 경우
        if (!cartItems.includes(title)) {
        
            // (1) 장바구니에 상품을 추가한다.
            cartItems.push(title);
            
            // (2) 수정된 장바구니 정보를 다시 로컬 스토리지에 저장한다.
            localStorage.setItem('cart', JSON.stringify(cartItems));
        
        // 3-2. 있을 경우
        } else {
            console.log(title + " is already in the cart.");
        }
    });
}

 

 

get.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <h2>장바구니 상품 목록</h2>
    <ul id="cartItems"></ul>

    <script>
        // 로컬 스토리지에서 장바구니 상품들을 가져와 화면에 출력
        let cartItems = JSON.parse(localStorage.getItem('cart')) || [];
        let cartList = document.getElementById('cartItems');

        cartItems.forEach(function(item) {
            let listItem = document.createElement('li');
            listItem.textContent = item;
            cartList.appendChild(listItem);
        });
    </script>
</body>
</html>

 

 


 

 

깃허브

https://github.com/kwonboryong/CodingApple/tree/main/localStorage

 

 


 

 

출처

코딩애플

 

https://gent.tistory.com/295