VueJS 初学者です。
学習中に詰まってしまったので、お助けいただけますと幸いです。
前提・実現したいこと
商品を定期的にお届けするサービスを作成しており、マイページから商品の内容を自由に変更できるようにしたい。
・現在定期購入している商品と定期購入していないそれ以外の商品を分けて表示したい。
・定期購入していない商品の個数を増やすと(デフォルトは0)、自動的に定期購入のリストに追加され、定期購入ではないリストから削除される。
・定期的に購入している商品は Vuex の store/user ファイルに保管している。
・全てのプロダクトの情報はCMS(Contentful)から fetch でとってきている。
使用している技術
Vue/Vuex/Nuxt
発生している問題
初期ローディングでは定期購入商品、その他商品が正しく表示されているが、その他商品の個数を変更すると定期購入商品リストに追加されるが、その他商品リストから削除されない
該当のソースコード
js
1// store/user.js 2 3export const state = () => ({ 4 info: { 5 name: "田中 太郎", 6 email: "test@gmail.com", 7 address: "千葉県 市川市 行徳 シェアプレイイス行徳", 8 postcode: "9011403", 9 phone: "09090909090", 10 rank: "gold", 11 mile: "2,800", 12 point: "500" 13 }, 14 15 subscription: { 16 subscribed: true, 17 discountRate: 20, 18 order: [ 19 { 20 id: "maple", 21 quantity: 12 22 }, 23 { 24 id: "chocolate", 25 quantity: 8 26 } 27 ], 28 deliveryDate: { latest: "", next: "" }, 29 orderHistory: [] 30 } 31}); 32 33export const mutations = { 34 ADD_PRODUCT_TO_SUBSCRIPTION(state, product) { 35 state.subscription.order.push(product); 36 }, 37 CHANGE_PRODUCT_QUANTITY(state, { id, quantity }) { 38 const item = state.subscription.order.find(item => item.id === id); 39 item.quantity = quantity; 40 }, 41 REMOVE_PRODUCT_FROM_SUBSCRIPTION(state, product) { 42 state.subscription.order = state.subscription.order.filter( 43 item => item.id !== product.id 44 ); 45 } 46};
vue
1// components/subscription.vue 2<template> 3 <div> 4 <ul v-if="subscription.subscribed"> 5 <li 6 v-for="product in subscribedItems" 7 :key="product.id" 8 > 9 </ul> 10 <ul> 11 <li 12 v-for="product in unsubscribedItems" 13 :key="product.id" 14 > 15 </ul> 16 </div> 17</template> 18 19<script> 20import { mapState } from "vuex"; 21 22export default { 23 data() { 24 return { 25 allProducts: [], 26 availableQuantity: [0, 2, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40], 27 }; 28 }, 29 computed: { 30 ...mapState("user", ["subscription"]), 31 subscribedItems() { 32 let items = []; 33 this.allProducts.forEach((product) => 34 this.subscription.order.forEach((item) => { 35 if (item.id === product.id) 36 items.push({ ...product, quantity: item.quantity }); 37 }) 38 ); 39 return items; 40 }, 41 // 商品の個数を変更した際に再度呼ばれてはいるが、追加した商品が残ったまま 42 unsubscribedItems() { 43 let items = this.allProducts.filter((product) => { 44 const item = this.subscription.order.find((item) => { 45 item.id === product.id; 46 }); 47 return item ? false : true; 48 }); 49 50 return items; 51 }, 52 }, 53 methods: { 54 addItem(product, event) { 55 let quantity = Number(event.target.value); 56 this.$store.commit("user/ADD_PRODUCT_TO_SUBSCRIPTION", { 57 id: product.id, 58 quantity, 59 }); 60 }, 61 changeItemQuantity(product, event) { 62 let quantity = Number(event.target.value); 63 64 if (quantity > 0) { 65 this.$store.commit("user/CHANGE_PRODUCT_QUANTITY", { 66 id: product.id, 67 quantity, 68 }); 69 } else { 70 this.$store.commit("user/REMOVE_PRODUCT_FROM_SUBSCRIPTION", { 71 id: product.id, 72 }); 73 } 74 }, 75 removeItem(product) { 76 this.$store.commit("user/REMOVE_PRODUCT_FROM_SUBSCRIPTION", product); 77 }, 78 }, 79 async fetch() { 80 const { products } = await this.$contentfulApi.getProducts(); 81 this.allProducts = [...products]; 82 }, 83}; 84</script>
あなたの回答
tips
プレビュー