Как хранить и извлекать элементы корзины покупок в локальном хранилище?

Я создаю корзину для веб-сайта электронной коммерции и хочу хранить продукты в локальном хранилище браузера.

Я внедрил в свой код следующие функции для добавления и извлечения продуктов.

addToCart() — это функция, которая запускается каждый раз, когда нажимается кнопка «Добавить в корзину».
addProduct() добавляет каждый товар в корзину.
getProductsFromLocalStorage() извлекает продукты из localStorage и добавляет продукты в корзину.

  function addToCart(trigger) {
    var cartIsEmpty = cartWrapper.hasClass('empty');
    //get localstorage cart product list
    getProductsFromLocalStorage();
    //update cart product list
    addProduct();
    //update number of items
    updateCartCount(cartIsEmpty);
    //update total price
    updateCartTotal(trigger.data('price'), true);
    //show cart
    cartWrapper.removeClass('empty');
  }

  function addProduct() {

    productId = productId + 1;
    var productName = document.getElementById('reebok').innerHTML;
    var productPrice = document.getElementById('p_price').getAttribute('data- value');
    var image = document.getElementById("main_img").src;
    var productSize = document.getElementById('size').value;
    var productColor = document.getElementById('color').value;
    value = parseFloat(productPrice).toFixed(2);

    var productAdded = $('<li class = "product"><div class = "product-image"><a href = "#0"><img src = "'+ image +'" alt = "placeholder"></a></div><div class = "product-details"><h3><a href = "#0">' + productName + '</a></h3><span class = "price">'+ productPrice +'</span><div class = "actions"><a href = "#0" class = "delete-item">Delete</a><a class = "delete-item">'+ productSize +'</a><a class = "delete-item">'+ productColor +'</a><div class = "quantity"><label for = "cd-product-' + productId + '">Qty</label><span class = "select"><select id = "cd-product-' + productId + '" name = "quantity"><option value = "1">1</option><option value = "2">2</option><option value = "3">3</option><option value = "4">4</option><option value = "5">5</option><option value = "6">6</option><option value = "7">7</option><option value = "8">8</option><option value = "9">9</option></select></span></div></div></div></li>');

    cartList.append(productAdded);

    let products = [{'productId' : productId + 1, image : image, name : productName, price: productPrice, size: productSize, color: productColor}];

    localStorage.setItem('products', JSON.stringify(products));

  }

  function getProductsFromLocalStorage() {
    const cs = localStorage.getItem('products');
    if (cs === null) {
      addProduct();
    } else {
      $.each(cs.products, function(key, value) {
        cartList.prepend($('<li class = "product"><div class = "product-image"><a href = "#0"><img src = "'+ value.image +'" alt = "placeholder"></a></div><div class = "product-details"><h3><a href = "#0">' + value.name + '</a></h3><span class = "price">${value.price}</span><div class = "actions"><a href = "#0" class = "delete-item">Delete</a><a class = "delete-item">' + value.size + '</a><a class = "delete-item">' + value.color + '</a><div class = "quantity"><label for = "cd-product-' + value.productId + '">Qty</label><span class = "select"><select id = "cd-product-' + value.productId + '" name = "quantity"><option value = "1">1</option><option value = "2">2</option><option value = "3">3</option><option value = "4">4</option><option value = "5">5</option><option value = "6">6</option><option value = "7">7</option><option value = "8">8</option><option value = "9">9</option></select></span></div></div></div></li>'));
      });
    }
  }

Теперь у меня возникла проблема с тем, что я не могу получить элементы корзины из локального хранилища и добавить их в корзину с новыми элементами. Это означает, что элементы корзины сохраняются в хранилище, но я вижу пустую корзину, когда пытаюсь добавить новые элементы, как показано ниже:

Скриншот корзины покупок

Демонстрация этого кода находится по адресу https://codyhouse.co/demo/add-to-cart-interaction/index.html.

Спасибо за любую помощь,

Джеймс.

См. developer.mozilla.org/en-US/docs/Web/API/Window/localStorage

Vinit Divekar 24.03.2019 22:35

Здравствуйте, Винит, я добавил дополнительную информацию к моему вопросу. Кажется, я не могу вернуть предметы из локального хранилища. Код для моих функций обновлен в вопросе выше. Большое спасибо за любую помощь, которую вы можете предоставить.

JamesM00 25.03.2019 18:51

Вы сохраняете продукты в локальном хранилище в виде строки JSON, но при повторном получении вы не анализируете продукты. Что вы должны сделать, это JSON.parse(localStorage.getItem('products')). Проверьте этот рабочий пример

Vinit Divekar 25.03.2019 20:26
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
3
20 879
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте этот пакет javascript для хранения любых данных в indexDB браузера, чтобы данные сохранялись после перезагрузки. местный корм

Зачем использовать пользовательскую библиотеку, когда доступно локальное хранилище браузера? См.: developer.mozilla.org/en-US/docs/Web/API/Window/localStorage

Vinit Divekar 24.03.2019 22:33

Localstorage позволяет хранить только строки, я предполагаю, что ваша корзина является объектом. localforage — хороший пакет для хранения объектов.

Odohi David 24.03.2019 22:36

Конечно. Однако вы можете хранить объекты в виде строк JSON.

Vinit Divekar 24.03.2019 22:47

Localforage оптимизирован для использования других сред, таких как indexDB, а не localstorage для хранения данных, в зависимости от типа данных, которые вы ему передаете. каждая из этих сред (indexDB, WebSQL и localstorage) имеет свои преимущества.

Odohi David 24.03.2019 22:50

Привет, Спанки, на самом деле я пытаюсь хранить продукты в локальном хранилище браузера, как сказал Винит.

JamesM00 24.03.2019 23:07
Ответ принят как подходящий

Вы должны использовать для этого локальное хранилище браузера.

В вашей функции addProduct вы должны добавить массив продуктов в элемент локального хранилища, скажем products; вот так:

function addProduct(){
    let products = [];
    if (localStorage.getItem('products')){
        products = JSON.parse(localStorage.getItem('products'));
    }
    products.push({'productId' : productId + 1, image : '<imageLink>'});
    localStorage.setItem('products', JSON.stringify(products));
}

Если вы хотите удалить продукт, вы можете сделать это следующим образом:

function removeProduct(productId){

    // Your logic for your app.

    // strore products in local storage

    let storageProducts = JSON.parse(localStorage.getItem('products'));
    let products = storageProducts.filter(product => product.productId !== productId );
    localStorage.setItem('products', JSON.stringify(products));
}

Пожалуйста, проверьте этот рабочий пример для рабочей демонстрации.

Спасибо за ответ, Винит, я обновил свой код, чтобы установить локальное хранилище с массивом моих продуктов. Буду ли я использовать localStorage.get для извлечения содержимого переменной localstorage при обновлении страницы? Спасибо еще раз.

JamesM00 24.03.2019 23:05

да. localStorage.getItem('<whatever_the_name>').

Vinit Divekar 24.03.2019 23:07

Спасибо за демонстрацию скрипки, я не знал, что могу проверить вкладку «Приложение» в инструментах разработки, чтобы увидеть функцию в действии. Проблема решена!

JamesM00 24.03.2019 23:12

Другие вопросы по теме