質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

Q&A

0回答

487閲覧

Vue:算出プロパティが正常に動作しない

Sentaro

総合スコア0

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

0グッド

1クリップ

投稿2021/02/22 23:32

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>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問