Chupachar
@Chupachar
front-end dev

Почему удаление из localStorage работает корректно только после перезагрузки страницы?

Всем привет, столкнулся с проблемой удаления объектов из localStorage, по факту я получаю с помощью fetch цифру, которая подразумевает стоимость в виде коллбэка result и провожу стандартные манипуляции внутри fetch, в виде формирования объекта с полученной стоимостью, push объекта в массив, суммирование данных из объекта и т.д. В случае данного кода всё вроде как работает нормально, но только если после добавления объектов перезагрузить страницу вида [{price: 100},{price: 200}] кликаем на Х какого то "отрисованного" объекта и получаем в результате [{price: 200}] всё как обычно. Если же повторить данный алгоритм событий но не перезагружать страницу после добавления, то после получаем [] в не зависимости от того какой объект мы удаляем. Я набросал приблизительно то что происходит в проекте касательно данной задачи, скажите пожалуйста в чем может быть причина, может где то с последовательностью напутал.
let price = JSON.parse(localStorage.getItem("price") || "[]"); 

button.addEventListener("click", function(e) { //кликаю
  fetch(url, opt)
    .then((response) => response.json())
    .then((result) => { //получаю сумму с backend
      let tariffVal = document.querySelector("#tariff-val"); //место рендера result

      let outputPrice = [];

      if (localStorage.getItem("price") != undefined) {
        outputPrice = JSON.parse(localStorage.getItem("price")); //присваииваю массиву результат хранилища 
      }

      let sumPriceObj = { //формирую объект для ЛС
        price: result.sum,
        id: parseInt(cart.id),
      };
      outputPrice.push(sumPriceObj); //пуш объектов в массив

      localStorage.setItem("price", JSON.stringify(outputPrice)); //записываю в ЛС

      //функция подсчета суммы
      function saveSumPriceToRender(outputPrice) {
        let sum = outputPrice.reduce((acc, curr) => acc + curr.price, 0);

        localStorage.setItem("sumPrice", sum);
        let sumPrice = parseInt(localStorage.getItem("sumPrice")) || 0;
        tariffVal.innerHTML = sumPrice;
      }
      saveSumPriceToRender(outputPrice);
    })
})

//за пределами клика рендерю данные из ЛС в разметку
function getSumPriceToRender() {
  let tariffVal = document.querySelector("#tariff-val");
  let sumPrice = parseInt(localStorage.getItem("sumPrice")) || 0;
  tariffVal.innerHTML = sumPrice;
}
getSumPriceToRender();

//удаление объектов из лс и пересчет суммы
function removeItem(e) {
  if (e.target.classList.contains("close")) {
    let sumAfterRemove = price.reduce((acc, curr) => acc + curr.price, 0); //пересчет суммы
    localStorage.setItem("price", JSON.stringify(price)); //перезапись объектов 
//клик на отрисованный объект до перезагрузки страницы, например 
//было 2 объекта остался пустой массив, а после перезагрузки страницы удаляет правильно 
//(было 2 объекта и при клике на Х остаётся 1 объект в массиве )
    localStorage.setItem("sumPrice", JSON.stringify(sumAfterRemove)); //перезаписываю сумму
    getSumPriceToRender(); //рендерю в разметку текущий результат суммы
  }
}
  • Вопрос задан
  • 175 просмотров
Решения вопроса 1
kritskiy_a
@kritskiy_a
Frontend-developer
потому что считывается прайс при рендере и нет актуального значения при удалении

function removeItem(e) {
  if (e.target.classList.contains("close")) {
    let price = JSON.parse(localStorage.getItem("price") || "[]"); 
    let sumAfterRemove = price.reduce((acc, curr) => acc + curr.price, 0); //пересчет суммы
    localStorage.setItem("price", JSON.stringify(price)); //перезапись объектов 
//клик на отрисованный объект до перезагрузки страницы, например 
//было 2 объекта остался пустой массив, а после перезагрузки страницы удаляет правильно 
//(было 2 объекта и при клике на Х остаётся 1 объект в массиве )
    localStorage.setItem("sumPrice", JSON.stringify(sumAfterRemove)); //перезаписываю сумму
    getSumPriceToRender(); //рендерю в разметку текущий результат суммы
  }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы