@aLeXxX_03

Почему localStorage работает только для 1-го или 2х элементов?

Необходимо, чтобы по клику на кнопку вызывалась функция addPlus или addMinus и она меняла значение объекта value на +1 или на -1, но итоговое значение value не может быть меньше 0.
Для этого я создал localStorage и обновляю значения в исходном массиве с помощью localStorage:

Код:
spoiler
import { defineStore } from "pinia";
import { ref, computed, watch } from "vue";

export const useStore = defineStore("Stores", () => {
  const Json = ref([
    {
      id: 1,
      value: 0,
      addPlus(id) {
        this.value = this.value + 1;
      },
      addMinus(id) {
        if (this.value > 0) {
          this.value = this.value - 1;
        }
      },
      image: "../img/juice_Ides.png",
      quantity: "В наличии 5 шт",
      name: "Хлеб Крестянский, 400г",
      price: "56",
      currency: "руб",
      basket: "В корзину",
      descr:
        "Мука пшеничная хлебопекарная первого сорта, вода, мука ржаная хлебопекарная сеяная, сахар-песок, соль поваренная пищевая, солод ржаной, экстракт солодовый.",
    },
    {
      id: 2,
      value: 0,
      addPlus(id) {
        this.value = this.value + 1;
      },
      addMinus(id) {
        if (this.value > 0) {
          this.value = this.value - 1;
        }
      },
      image: "../img/bread.png",
      quantity: "В наличии 3 шт",
      name: "Белый хлеб, 400г",
      price: "59",
      currency: "руб",
      basket: "В корзину",
      descr: "Белый хлеб",
    }
   
  ]);

  const Store = localStorage.getItem("Json");

  Json.value.map((item, index) =>
    JSON.parse(Store)._value[index].value !== Json.value[index].value
      ? (Json.value[index].value = JSON.parse(Store)._value[index].value)
      : (Json.value[index].value = JSON.parse(Store)._value[index].value)
  );

  watch(
    () => Json,
    (state) => {
      localStorage.setItem("Json", JSON.stringify(state));
    },
    { deep: true }
  );
  return {
    Json,
  };
});


Проблема в том, что если я в массив Json добавляю еще один аналогичный объект(можно даже просто скопировать такой же, сделав 3 объекта в массиве), то ничего не работает и браузер кричит, что
Cannot read properties of undefined (reading 'value')


Как исправить?
  • Вопрос задан
  • 647 просмотров
Пригласить эксперта
Ответы на вопрос 1
@aLeXxX_03 Автор вопроса
Причину нашел, но как решить эту проблему так и НЕ понял.

В общем, когда первый раз запускается этот проход по массиву

Json.value.map((item, index) =>
    JSON.parse(Store)._value[index].value !== Json.value[index].value
      ? (Json.value[index].value = JSON.parse(Store)._value[index].value)
      : (Json.value[index].value = JSON.parse(Store)._value[index].value)
  );


, то в const Store, который содержит в себе localStorage - уже был запушен внутри watch json-объект, вот тут:

localStorage.setItem("Json", JSON.stringify(state));


А когда я добавляю новый объект в массив Json, то я так понимаю watch просто записал в Store localStorage значения при первом запуске и при включении этого блока(который ниже) идет ошибка:

Json.value.map((item, index) =>
    JSON.parse(Store)._value[index].value !== Json.value[index].value
      ? (Json.value[index].value = JSON.parse(Store)._value[index].value)
      : (Json.value[index].value = JSON.parse(Store)._value[index].value)
  );


Типа в Json.value у нас появился НОВЫЙ объект, а в localStorage его так и нет, потому при проходе внутри map возникает конфликт и получается ошибка.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы