前言
前面我們已經把 Vuex 的特性都解說完畢,應該對 Vuex 有初步的了解,但是如果沒有實作我們還是沒有辦法很熟悉,官方這邊提供了一個購物車的範例,我們就以此來看看要如何將 Vuex 應用在購物車中。
組件
範例中共有 3 個組件分別是:
- APP.vue - 作為 layout 導入 Cart 與 ProductList 組件。
- ProductList.vue - 商品清單。
- Cart.vue - 購物車,呈現新增到購物車的商品。
ProductList
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| <template> <ul> <li v-for="p in products"> {{ p.title }} - {{ p.price | currency }} <br> <button :disabled="!p.inventory" @click="addToCart(p)"> Add to cart </button> </li> </ul> </template>
<script> import { mapGetters, mapActions } from 'vuex'
export default { computed: mapGetters({ products: 'allProducts' }), methods: mapActions([ 'addToCart' ]), created () { this.$store.dispatch('getAllProducts') } } </script>
|
Cart
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| <template> <div class="cart"> <h2>Your Cart</h2> <p v-show="!products.length"><i>Please add some products to cart.</i></p> <ul> <li v-for="p in products"> {{ p.title }} - {{ p.price | currency }} x {{ p.quantity }} </li> </ul> <p>Total: {{ total | currency }}</p> <p><button :disabled="!products.length" @click="checkout(products)">Checkout</button></p> <p v-show="checkoutStatus">Checkout {{ checkoutStatus }}.</p> </div> </template>
<script> import { mapGetters } from 'vuex'
export default { computed: { ...mapGetters({ products: 'cartProducts', checkoutStatus: 'checkoutStatus' }), total () { return this.products.reduce((total, p) => { return total + p.price * p.quantity }, 0) } }, methods: { checkout (products) { this.$store.dispatch('checkout', products) } } } </script>
|