1.产品展示组件-ProductList
ProductList组件用来展示产品列表,需要给每个产品添加添加购物车的按钮和点击事件addProduct(item)需要将当前的产品项item传递进去。
<!-- 商品列表 -->
<template>
<div>
<h2>我是商铺组件啊</h2>
<ul>
<li v-for="(item) in products" :key="item.title">
{{item.title}}-{{item.price | currency }}---{{item.inventory}} <br>
<!-- 🤪添加按钮 -->
<button :disabled="!item.inventory" @click="addProduct(item)">添加购物车</button>
</li>
</ul>
</div>
</template>
<script>
import {
mapState,
mapActions
} from 'vuex';
export default {
//组件名字用来注册全库组件时候使用
name: "ProductList",
created() {
//发送请求,获取数据
this.$store.dispatch("products/getAllProducts")
},
computed: {
//获取请求到的products
...mapState('products', ['products']),
},
mounted() {},
methods: {
//映射cart模块的添加购物车的方法
...mapActions("cart", ["addProduct"])
}
};
</script>
<style lang="scss" scoped>
</style>
- 接着看下
store/modules/cart.jsaddproduct中,判断库存、之前购物车中是否添加过该商品等,然后提交commit完成对应的操作cart模块里去提交products模块的数据(修改products模块的内容的时候)需要添加第3个参数--{root:true}
export default {
namespaced:true,
state:{
count:0,
cartList:[
{
id:1,
title:"iphone12",
price:1200,
quantity:0
}]
},
getters:{
//添加购物车的计算结果
getCartList(state,getters,rootState){
return state.cartList.map(({id,quantity})=>{
const product = rootState.products.products.find(item=> item.id === id);
return {
title:product.title,
price:product.price,
quantity
}
})
},
//总价格
cartTotalPrice(state,getters){
return getters.getCartList.reduce((total,product)=>{
return total + product.price * product.quantity
},0)
}
},
mutations:{
//更新购物车的数据
addProductToCart(state,{id,quantity}){
console.log("我是被添加的id",id);
state.cartList.push({id,quantity});
},
//购物车中已有数据--那就找到那个商品项目对其数量+1
incrementCartQuantity(state,{id}){
const curItem = state.cartList.find(item=>item.id===id);
curItem.quantity++;
}
},
actions:{
addProduct({commit,state},product){
if(product.inventory > 0)//有库存
{
const cartItem = state.cartList.find(item=>{
return item.id === product.id
});
//购物车中没有数据,新添加到购物车
if(!cartItem)
{ console.log("我进来了哈");
commit("addProductToCart",{id:product.id,quantity:1});
}else{
//购物车中已有数据
commit("incrementCartQuantity",{id:product.id})
}
//🤪这里需要减少库存的值
//当在一个模块提交另一个模块上的东西的时候,一定要在根上也就是{root:true}
commit("products/decrementNum",{id:product.id},{root:true})
}
}
}
}
🍭下篇来记录下products.js的内容