This article example shares the specific code of Vuex to implement a simple shopping cart for your reference. The specific content is as follows File Structure App.vue <template> <div id="app"> <h3>Shopping Cart Demo</h3> <hr> <h4>Products:</h4> <ProductList /> <hr> <h4>My Cart</h4> <ShoppingCart /> </div> </template> <script> import ProductList from '@/components/ProductList'; import ShoppingCart from '@/components/ShoppingCart'; export default { components: ProductList, ShoppingCart } } </script> Products.vue <template> <div> <ul v-for="item in products" :key="item.id"> <li> {{ item.title }} - {{ item.price }} Inventory: {{ item.inventory }}<br> <button :disabled="!item.inventory" @click="addToCart(item)">add to cart</button> </li> </ul> </div> </template> <script> import { mapGetters, mapActions } from 'vuex'; export default { computed: { // ...mapGetters('products',{ // products: 'allProducts' // }) ...mapGetters({ products: 'products/allProducts' }) }, methods: { ...mapActions('cart',['addToCart']) }, created() { this.$store.dispatch('products/getAllProducts'); } } </script> ShoppingCart.vue <template> <div> <ul v-for="item in products" :key="item.id"> <li>{{ item.title }} *{{ item.quantity }}</li> </ul> <div>total: {{ total }}</div> </div> </template> <script> import { mapGetters } from 'vuex'; export default { computed: { ...mapGetters('cart', { products: 'cartProducts', total: 'cartTotalPrice' }) } } </script> modules/products.js import api from '../../api'; const state = { all: [] } const getters = { allProducts: state => state.all } const actions = { // Get initial product data getAllProducts({ commit }) { api.getProducts(products => commit('setProducts', products)); } } const mutations = { setProducts(state, products) { state.all = products; }, // Reduce the inventory of this product decreamentInventory(state, { id }) { let productItem = state.all.find(item => item.id === id); productItem.inventory --; } } export default { namespaced: true, state, getters, actions, mutations } modules/cart.js const state = { addedList: [] } const getters = { cartProducts(state, getters, rootState) { return state.addedList.map((item, index) => { let productItem = rootState.products.all.find(product => product.id === item.id); return { title: productItem.title, price: productItem.price, quantity: item.quantity } }) }, cartTotalPrice(state, getters) { return getters.cartProducts.reduce((total, product) => { return total + (product.price * product.quantity); }, 0); } } const actions = { addToCart({ state, commit }, product) { if (product.inventory > 0) { let productItem = state.addedList.find(item => item.id === product.id); if (productItem) { commit('increamentItemQuantity', productItem); } else { commit('pushItemToCart', product); } commit('products/decreamentInventory', product, { root: true }); } } } const mutations = { // Increase the number of identical items in the shopping cart increaseItemQuantity(state, { id }) { let productItem = state.addedList.find(item => item.id === id); productItem.quantity++; }, // Add the item to the shopping cart pushItemToCart(state, { id }) { state.addedList.push({ id, quantity: 1 }) }, } export default { namespaced: true, state, getters, actions, mutations } store/index.js import Vue from 'vue'; import Vuex from 'vuex'; import cart from './modules/cart'; import products from './modules/products'; Vue.use(Vuex); export default new Vuex.Store({ modules: cart, products } }); main.js import Vue from "vue"; import App from "@/components/App.vue"; import store from "@/store"; Vue.config.productionTip = false; new Vue({ store, render: h => h(App) }).$mount("#app"); The above is the full content of this article. I hope it will be helpful for everyone’s study. I also hope that everyone will support 123WORDPRESS.COM. You may also be interested in:
|
<<: An example of implementing a simple infinite loop scrolling animation in Vue
>>: JS realizes the scrolling effect of announcement online
Preface smb is the name of a protocol that can be...
Preface The gradient of the old version of the br...
CSS naming rules header: header Content: content/c...
1. Document flow and floating 1. What is document...
Table of contents 1. Leftmost prefix principle 2....
The 2008.5.12 Wenchuan earthquake in Sichuan took...
When searching online for methods to install MySQ...
Table of contents Preface vue-cli 2.0 version vue...
Google China has released a translation tool that ...
Table of contents Parent component listBox List c...
Disk quota is the storage limit of a specified di...
Table of contents Preface 1. Application componen...
introduction During the front-end project develop...
Normal explanation % means any client can connect...
This article uses an example to illustrate the us...