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
1. The relationship between fonts and character d...
Sometimes we may need to operate servers in batch...
question When we are developing normally, if we w...
This article example shares the specific code of ...
Browser compatibility is nothing more than style ...
I once encountered an assignment where I was give...
Table of contents 1. Mapped Types 2. Mapping Modi...
A jQuery plugin every day - step progress axis st...
Preface Components are something we use very ofte...
Preface In JavaScript, you need to use document.q...
This article example shares the specific code of ...
When developing a web project, you need to instal...
Table of contents Port-related concepts: Relation...
This article shares the specific code of JS to ac...
MySQL-Group-Replication is a new feature develope...