いつもお世話になっております。
現在、ECサイトと作成する過程で、複数のデータを一つのセットにまとめてLocalStorageに保存する方法について模索しております。
開発環境
Mac, Vue, BoostrapVue
サーバーホストネームは https://euas.person.ee/ です
POSTとGETの使い方がまだよく分かっていないのですが、下記の3点を意識しています。
1)POST / user / carts / {cardId} / orders -指定されたcartIdに基づいてorderを作成します
2)GET / user / orders- orderの配列をreturnします。構造はShoppingCartと同じ
3)GET / user / orders / {orderId} -特定のorderをretunします。構造はShoppingCartと同じにする
下に2つの画像がありますが、"ShoppingCart"で表示されている3つのプロダクトとその他の情報(Price, qty,Amount,そしてTotalPrice)をまとめて、cartId:1に保存して、"OrderListing"(2枚めの写真)のCartIdとTotalPriceで表示したいと考えています。
Order Now!ボタンを押すと、ShoppingCartが空になる仕様です。
なので、ShoppingCartでデータを保存して、LocalStorageにcartIdごとにデータセットを保存するやり方について教えていただけると幸いです。
赤字は画像に書き込んだもので、実際に表示されているわけではありません.
ShoppingCartVue
1<template> 2<div class="shopping-cart-page"> 3 <h2>ShoppingCart</h2> 4 <table class="table"> 5 <tr> 6 <th>Product</th> 7 <th>Price</th> 8 <th>qty</th> 9 <th>Amount</th> 10 <th>Actions</th> 11 </tr> 12 13 <tr v-for="(item, index) in this.items" :key="item.productId + '_' + index"> 14 <td> 15 <img :src="item.optionImage" class="option-image" /> 16 </td> 17 <td>{{ item.price }}</td> 18 <td>{{ item.qty }}</td> 19 <td>{{ item.total }}</td> 20 <td> 21 <b-button variant="danger" @click="removeItem(index)">Remove</b-button> 22 </td> 23 </tr> 24 <tr class="total-row"> 25 <td>TOTAL:</td> 26 <td></td> 27 <td></td> 28 <td>{{ total }}</td> 29 <td></td> 30 </tr> 31 </table> 32 33 <b-button variant="success" size="lg" @click="orderNow" v-if="this.items.length">Order Now!</b-button> 34 35</div> 36</template> 37 38<script> 39import axios from "axios"; 40export default { 41 name: 'ShoppingCartPage', 42 computed: { 43 items: function() { 44 return this.$root.$data.cart.items || []; 45 }, 46 total: function() { 47 let sum = 0 48 for (const item of this.items) { 49 sum += item.total 50 } 51 return sum 52 } 53 }, 54 methods: { 55 removeItem: function(index) { 56 if (!this.$root.$data.cart.items) this.$root.$data.cart.items = [] 57 this.$root.$data.cart.items.splice(index, 1); 58 console.log(this.$root.$data.cart.items); 59 this.$root.$data.saveCart(); 60 }, 61 62 orderNow: function() { 63 let data = this.$root.$data 64 65 axios.post("https://euas.person.ee/user/carts/" + this.$root.$data.cart.id + "/orders", 66 this.$root.$data.cart).then(function() { 67 data.reinitCart(); 68 }) 69 } 70 } 71} 72</script> 73 74 75<style scoped> 76.option-image { 77 max-height: 50px; 78 max-width: 100px; 79} 80</style> 81
正直、何処を変えれば、cartIdが表示されるかわからなかったので、ShoppingCartをコピペして、一部を変化させただけになっています。↓
OrderListingVue
1<template> 2<div class="OrderListing"> 3 <h2>Your Orders</h2> 4 <table class="table"> 5 <tr> 6 <th>CartId</th> 7 <th>TotalPrice</th> 8 <th>Action</th> 9 </tr> 10 11 <tr v-for="(item, index) in this.items" :key="item.productId + '_' + index"> 12 13 <td>ここにcartIdを表示</td> 14 <td>ここにcartIdごとのtotalPriceを表示したい</td> 15 </tr> 16 </table> 17 18 19 20</div> 21</template> 22 23<script> 24 25export default { 26 name: 'OrderListing', 27 computed: { 28 items: function() { 29 return this.$root.$data.cart.items || []; 30 }, 31 total: function() { 32 let sum = 0 33 for (const item of this.items) { 34 sum += item.total 35 } 36 return sum 37 } 38 }, 39 methods: { 40 } 41} 42</script> 43 44 45<style scoped> 46.option-image { 47 max-height: 50px; 48 max-width: 100px; 49} 50</style>
main.js↓では、POSTとGETを設定していくと思うのですが、どうすれば、OrderごとにcartIdに保存できるのかわかりません。
main
1import Vue from 'vue' 2import App from './App.vue' 3import BootstrapVue from 'bootstrap-vue' 4import 'bootstrap/dist/css/bootstrap.css' 5import 'bootstrap-vue/dist/bootstrap-vue.css' 6import VueRouter from 'vue-router' 7import MainPage from './components/MainPage.vue' 8import ProductPage from './components/ProductPage.vue' 9import Category from './components/Category.vue' 10 11import axios from "axios"; 12import ShoppingCartPage from './components/ShoppingCartPage.vue' 13import OrderListing from './components/OrderListing.vue' 14 15 16Vue.config.productionTip = false 17Vue.use(BootstrapVue) 18Vue.use(VueRouter) 19 20const router = new VueRouter({ 21 routes: [{ 22 path: '/', 23 component: MainPage 24 }, 25 26 { 27 path: '/categories/:categoryAlias', 28 component: Category 29 }, 30 { 31 path: '/products/:productId', 32 component: ProductPage 33 }, 34 { 35 path: '/cart', 36 component: ShoppingCartPage 37 }, 38 { 39 path: '/order', 40 component: OrderListing 41 } 42 ], 43 mode: 'history' 44}); 45 46axios.defaults.headers.common['Authorization'] = 'Bearer pasuwaado135@gmail.com'; 47 48if (localStorage.cartId) { 49 axios.get("https://euas.person.ee/user/carts" + localStorage.cartId).then(response => { 50 new Vue({ 51 render: h => h(App), 52 router: router, 53 data: { 54 cart: response.data, 55 saveCart() { 56 axios.put("https://euas.person.ee/user/carts/" + this.cart.id, this.cart) 57 }, 58 reinitCart() { 59 axios.post("https://euas.person.ee/user/carts").then(response => { 60 localStorage.cartId = response.data.id 61 this.cart = response.data; 62 }); 63 } 64 } 65 }).$mount('#app') 66 }); 67} else { 68 axios.post("https://euas.person.ee/user/carts").then(response => { 69 new Vue({ 70 render: h => h(App), 71 router: router, 72 data: { 73 cart: response.data, 74 saveCart() { 75 axios.put("https://euas.person.ee/user/carts/" + this.cart.id, this.cart) 76 }, 77 reinitCart() { 78 axios.post("https://euas.person.ee/user/carts").then(response => { 79 localStorage.cartId = response.data.id 80 this.cart = response.data; 81 }); 82 } 83 } 84 }).$mount('#app') 85 }); 86}
回答1件
あなたの回答
tips
プレビュー