Vuex实现简单购物车


Posted in Vue.js onJanuary 10, 2021

本文实例为大家分享了Vuex实现简单购物车的具体代码,供大家参考,具体内容如下

文件结构

Vuex实现简单购物车

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 }}    库存: {{ 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 = {
 // 获取初始商品数据
 getAllProducts({ commit }) {
 api.getProducts(products => commit('setProducts', products));
 }
}
 
const mutations = {
 setProducts(state, products) {
 state.all = products;
 },
 // 减少该商品库存
 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 = {
 // 增加购物车中同等商品的数量
 increamentItemQuantity(state, { id }) {
 let productItem = state.addedList.find(item => item.id === id);
 productItem.quantity ++;
 },
 // 将商品加入购物车
 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");

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Vue.js 相关文章推荐
详解Vue的mixin策略
Nov 19 Vue.js
浅谈Vue使用Elementui修改默认的最快方法
Dec 05 Vue.js
Vue+penlayers实现多边形绘制及展示
Dec 24 Vue.js
Vue 修改网站图标的方法
Dec 31 Vue.js
vue3.0中友好使用antdv示例详解
Jan 05 Vue.js
如何在Vue项目中添加接口监听遮罩
Jan 25 Vue.js
Vue的过滤器你真了解吗
Feb 24 Vue.js
Vue中使用import进行路由懒加载的原理分析
Apr 01 Vue.js
vue中div禁止点击事件的实现
Apr 02 Vue.js
vue代码分块和懒加载非必要资源文件
Apr 11 Vue.js
vue 自定义组件添加原生事件
Apr 21 Vue.js
Vue实现一种简单的无限循环滚动动画的示例
Jan 10 #Vue.js
基于vuex实现购物车功能
Jan 10 #Vue.js
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
Jan 08 #Vue.js
vue-quill-editor插入图片路径太长问题解决方法
Jan 08 #Vue.js
vue编写简单的购物车功能
Jan 08 #Vue.js
解决vue使用vant轮播组件swipe + flex时文字抖动问题
Jan 07 #Vue.js
vuex的使用和简易实现
Jan 07 #Vue.js
You might like
php面向对象全攻略 (十四) php5接口技术
2009/09/30 PHP
php设计模式 Observer(观察者模式)
2011/06/26 PHP
PHP请求远程地址设置超时时间的解决方法
2016/10/29 PHP
php精度计算的问题解析
2019/06/21 PHP
jquery弹出框的用法示例(2)
2013/08/26 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
为JS扩展Array.prototype.indexOf引发的问题及解决办法
2015/01/21 Javascript
js电话号码验证方法
2015/09/28 Javascript
Vue监听数组变化源码解析
2017/03/09 Javascript
Thinkjs3新手入门之添加一个新的页面
2017/12/06 Javascript
使用async、enterproxy控制并发数量的方法详解
2018/01/02 Javascript
关于Vue的路由权限管理的示例代码
2018/03/06 Javascript
JS+HTML5 canvas绘制验证码示例
2018/12/05 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
详解ES6 中的Object.assign()的用法实例代码
2021/01/11 Javascript
python实现对excel进行数据剔除操作实例
2017/12/07 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
python计算两个矩形框重合百分比的实例
2018/11/07 Python
Python实现语音识别和语音合成功能
2019/09/20 Python
numpy.transpose()实现数组的转置例子
2019/12/02 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
H5 meta小结(前端必看篇)
2016/08/24 HTML / CSS
video.js支持m3u8格式直播的实现示例
2020/05/20 HTML / CSS
ECCO爱步加拿大官网:北欧丹麦鞋履及皮具品牌
2017/07/08 全球购物
土耳其时尚购物网站:Morhipo
2017/09/04 全球购物
意大利在线购买隐形眼镜网站:VisionDirect.it
2019/03/18 全球购物
《欢乐的泼水节》教学反思
2014/04/22 职场文书
结婚仪式主持词
2015/06/29 职场文书
党校培训学习心得体会
2016/01/06 职场文书
2016年学校招生广告语
2016/01/28 职场文书
同学联谊会邀请函
2019/06/24 职场文书
python 逐步回归算法
2021/04/06 Python
js中Map和Set的用法及区别实例详解
2022/02/15 Javascript
MySQL中一条update语句是如何执行的
2022/03/16 MySQL