Не могу удалить товары из корзины в vue 3 с помощью pinia

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

Код:

Магазин.vue

<template>
  <div class = "shop">
    Cart Items: <cart-badge :count = "cartLength">{{ count }}</cart-badge>
    <h1>shop</h1>
    <div class = "products" v-for = "item in Products" :key = "item.id">
      {{ item.name }} {{ item.price }}$
      <button @click = "storeCounter.addToCart(item)">Add to Cart</button>
    </div>
  </div>
</template>
<script setup>
import { useCounterStore } from "../stores/counter";
import Products from "../db.json";
import CartBadge from "../components/CartBadge.vue";
import { computed } from "vue";

const storeCounter = useCounterStore();

const cartLength = computed(() => {
  return storeCounter.cart.length;
});
</script>

Store.js(пиния)

import { defineStore } from "pinia";

export const useCounterStore = defineStore("counter", {
  state: () => ({
    cart: [],
  }),
  actions: {
    addToCart(id) {
      this.cart.push(id);
      console.info("test passed!");
    },
    removeFromCart(id) {
      this.cart.splice(id);
      console.info("removed from cart!");
    },
  },
});

Корзина.vue

<template>
    <div class = "cart">
        <h1>cart</h1>
        <div class = "cartitems" v-for = "item in storeCounter.cart" :key = "item.id">{{ item.name }} {{ item.price }}$
        <button @click = "storeCounter.removeFromCart(item.id)">X</button>
        </div>
    </div>
</template>

<script setup>
import { useCounterStore } from '../stores/counter';

const storeCounter = useCounterStore()

</script>
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел &quot;Заголовок&quot; в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
0
0
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Splice использует индекс элемента для его удаления.

Сделайте это вместо этого;

removeFromCart(id) {
    let cartItemIndex = this.cart.findIndex(x => x.id === id);

    if (cartItemIndex >= 0) {
        this.cart.splice(cartItemIndex, 1);
        console.info("Removed from cart");
    }
}

Или если вы больше не хотите использовать сращивание (и если производительность имеет значение);

removeFromCart(id) {
    this.cart = this.cart.filter(x => x.id !== id);
    console.info("Removed from cart");
}

Пожалуйста, используйте более описательные имена параметров. Переименуйте «id» в «item» в addToCart, так как вы добавляете не просто идентификатор элемента, а весь предмет. Это может сбить с толку других разработчиков и сделать ваш код нечитаемым.

addToCart(item) {
    this.cart.push(item)
    console.info('test passed!')
}

Референции: сращивание фильтр

Спасибо, но он сначала удаляет только последний элемент, независимо от того, на какую кнопку какого элемента я нажал... как это исправить?

kikidoyouloveme 11.01.2023 00:52

Идентификаторы уникальны?

Bernard Borg 11.01.2023 00:56

Да это идет как 1,2,3 и т.д. и т.п.

kikidoyouloveme 11.01.2023 00:59

Теперь, когда я пытаюсь удалить товар из корзины, я могу, но до первого добавленного. (первый нельзя удалить)

kikidoyouloveme 11.01.2023 15:15

Оно работает. Смотрите здесь

Bernard Borg 11.01.2023 15:51

Ну, ответ findindex у меня не работает

kikidoyouloveme 11.01.2023 16:00

Ты прав. Моя ошибка - см. обновленный код

Bernard Borg 11.01.2023 16:05

Сейчас проверил ответ фильтра и тоже не работает!

kikidoyouloveme 11.01.2023 16:07

Вы вообще пытались отлаживать свой собственный код? Ответ фильтра работает

Bernard Borg 11.01.2023 16:08

Новый findindex все еще не работает...

kikidoyouloveme 11.01.2023 16:08

Оба решения не будут работать, если ваши идентификаторы не уникальны. Убедитесь, что они есть, иначе решение работает так, как задумано. У вас могут быть проблемы в другом месте — откройте другой поток stackoverflow для получения дополнительной помощи.

Bernard Borg 11.01.2023 16:10

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