Поэтому в журнале консоли говорится, что он удаляется из корзины, но я все еще вижу элементы в корзине... как я могу удалить их из корзины? Я использую 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>
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!')
}
Референции: сращивание фильтр
Идентификаторы уникальны?
Да это идет как 1,2,3 и т.д. и т.п.
Теперь, когда я пытаюсь удалить товар из корзины, я могу, но до первого добавленного. (первый нельзя удалить)
Оно работает. Смотрите здесь
Ну, ответ findindex у меня не работает
Ты прав. Моя ошибка - см. обновленный код
Сейчас проверил ответ фильтра и тоже не работает!
Вы вообще пытались отлаживать свой собственный код? Ответ фильтра работает
Новый findindex все еще не работает...
Оба решения не будут работать, если ваши идентификаторы не уникальны. Убедитесь, что они есть, иначе решение работает так, как задумано. У вас могут быть проблемы в другом месте — откройте другой поток stackoverflow для получения дополнительной помощи.
Спасибо, но он сначала удаляет только последний элемент, независимо от того, на какую кнопку какого элемента я нажал... как это исправить?