vue手机商城项目实战(10)-购物车组件实现

Web前端 潘老师 3年前 (2020-09-20) 2671 ℃ (3) 扫码查看

1、在购物车中没有商品时,显示购物车为空图片,图片下载:

文件下载

  文件名称:空购物车图片   文件大小:5.9kb
  下载声明:本站资源仅供学习和研究使用,不得用于商业用途。如资源不慎侵犯你的版权请联系博主处理!
  下载地址:本地下载" rel="nofollow noopener noreferrer" target="_blank"> 点击下载   
解压密码:www.panziye.com

2、解压后上传至assets\img目录下

修改Shopcar.vue如下:

<template>
<div id="shopcar">
<!-- 顶部导航栏 -->
<mt-header title="购物车">
<mt-button slot="left" icon="back" @click="goback">返回</mt-button>
</mt-header>
<div class="main">
<p class="remind" v-if="shopCart.length===0">
<img :src="emptycart" />
</p>
<ul class="goods-list" v-if="shopCart.length>0">
<li v-for="(item,index) in shopCart" :key="item.id">
<span @click.stop="changeSelected(index)" class="choose-icon">
<icon :name="item.selected?'check-circle':'circle'" scale="1.4"></icon>
</span>
<img :src="item.img[0]" />
<div class="name">{{item.name}}</div>
<div class="price">
<div class="single">单价:¥{{item.price}}</div>
<div class="all">合计:¥{{item.price*item.num}}</div>
</div>
<div class="add">
<span @click.stop="changeCartNum(index,-1)">
<icon name="minus" scale=".8"></icon>
</span>
<span class="num">{{item.num}}</span>
<span @click.stop="changeCartNum(index,1)">
<icon name="plus" scale=".8"></icon>
</span>
</div>
<div class="remove" @click.stop="removeFromCart(index)">删除</div>
</li>
</ul>
</div>
<div class="total">
<span class="choose-icon" @click.stop="changeSelectedAll">
<icon :name="isSelectedAll&&shopCart.length>0?'check-circle':'circle'" scale="1.4"></icon>
</span>
<div class="content">
合计
<span class="price">¥ {{totalPrice}}</span>
//暂时不实现
<span class="order" @click.stop="buy">结算</span>
</div>
</div>
</div>
</template>
<script>
import { MessageBox } from 'mint-ui';
export default {
data(){
return {
emptycart:require("@/assets/img/emptycart.jpg")
}
},
methods:{
// 返回
goback(){
this.$router.go(-1);
},
// 提交改变选中状态
changeSelected(index){
this.$store.commit("changeSelected",index);
},
// 提交删除商品
removeFromCart(index){
// 提示
MessageBox.confirm('确定删除该商品吗?').then(action => {
this.$store.commit("removeFromCart",index);
});
},
// 提交改变数量
changeCartNum(index,changeNum){
if(this.shopCart[index].num == 1 && changeNum == -1){
// 如果数量为1且减少数量,则删除
this.removeFromCart(index);
}else{
// 修改
this.$store.commit("changeCartNum",{index,changeNum});
}
},
// 提交改变全选状态
changeSelectedAll(){
this.$store.commit("changeSelectedAll");
}
},
computed:{
// 获取购物车
shopCart(){
return this.$store.state.shopCart;
},
// 获取是否全选
isSelectedAll(){
return this.$store.getters.isSelectAll;
},
// 获取选中商品总价
totalPrice(){
return this.$store.getters.totalPrice;
}
}
}
</script>
<style scoped>
#shopcar {
position: fixed;
top: 0;
bottom: 0;
width:100%;
z-index: 3;
background-color:#fff;
}
.main {
position: fixed;
width: 100%;
overflow-y: auto;
}
.remind img {
display: block;
width: 100%;
}
.goods-list li {
position: relative;
display: flex;
align-items: center;
width: 100%;
border-bottom: 1px solid #ddd;
margin-top:2px;
}
.goods-list li .choose-icon {
padding: 0 6px;
color: #1296db;
}
.goods-list li img {
margin: 4px 10px;
width: 40px;
height: 41px;
border-radius: 50%;
}
.goods-list li .name {
width: 80px;
font-size: 15px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.goods-list li .price {
font-size: 10px;
margin-left: 10px;
color: #e8380d;
}
.single {
margin-top: 8px;
line-height: 20px;
}
.all {
line-height: 20px;
}
.add {
position: absolute;
top: 50%;
right: 60px;
transform: translateY(-50%);
}
.add span {
float: left;
}
.add span .fa-icon {
padding: 2px;
color: #fff;
background-color: #1296db;
border-radius: 50%;
}
.add span.none .fa-icon {
background-color: #eee;
}
.add span.num {
margin: 0 6px;
line-height: 20px;
font-size: 14px;
}
.remove {
position: absolute;
top: 0;
bottom: -1px;
right: 0;
width: 50px;
line-height: 50px;
text-align: center;
color: #fff;
background-color: #e8380d;
}
.total {
position: fixed;
bottom: 0;
display: flex;
align-items: center;
width: 100%;
height: 40px;
border-top: 1px solid #ddd;
}
.total .choose-icon {
padding: 0 6px;
color: #1296db;
}
.total .content {
margin-left: 10px;
width: 100%;
line-height: 40px;
}
.total .content .price {
margin-left: 10px;
font-size: 14px;
color: #e8380d;
}
.total .content .order {
float: right;
width: 50%;
font-size: 14px;
text-align: center;
color: #fff;
background-color: #e8380d;
}
</style>

修改store\index.js
1、在mutations中新增以下方法:

// 改变商品选中状态
changeSelected(state,index){
state.shopCart[index].selected = !state.shopCart[index].selected;
},
// 删除商品
removeFromCart(state,index){
state.shopCart.splice(index,1);
},
// 改变购物车商品数量
changeCartNum(state,playload){
var index = playload.index;
var changeNum = playload.changeNum;
state.shopCart[index].num += changeNum;
},
// 全选或全不选
changeSelectedAll(state){
// 获取是否为全选状态
var flag = this.getters.isSelectAll;
// 如果全选,则全不选,没全选则全选
for(var i=0;i<state.shopCart.length;i++){
state.shopCart[i].selected = !flag ;
}
}

2、新增getters属性如下:

getters:{
// 是否全选
isSelectAll(state){
for(var i=0;i<state.shopCart.length;i++){
if(!state.shopCart[i].selected){
return false;
}
}
return true;
},
// 选中商品总价
totalPrice(state){
var sum = 0;
for(var i=0;i<state.shopCart.length;i++){
if(state.shopCart[i].selected){
sum += state.shopCart[i].price * state.shopCart[i].num;
}
}
return sum;
}
}

vue手机商城项目实战(10)-购物车组件实现


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/web/1306.html
喜欢 (16)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】

(3) 个小伙伴在畅所欲言
  1. 用户头像
    老师,后面的分类组件和登录组件有吗
    Violetnanpro 2023-12-09 15:57 回复
  2. 用户头像
    老师,还有后续吗
    Violetnanpro 2023-12-09 15:45 回复
    • 潘老师
      有的,看这篇文章:https://www.panziye.com/teach/1898.html
      潘老师 2023-12-09 15:46 回复