软件教程 2025年08月6日
0 收藏 0 点赞 907 浏览 4724 个字
摘要 :

一、素材准备 1、在购物车中没有商品时,显示购物车为空图片,图片下载: 文件下载   文件名称:空购物车图片   文件大小:5.9kb  &nbs……

一、素材准备

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.zuozi.net/6018.html

管理员

相关推荐
2025-08-06

文章目录 一、Promise基础回顾 二、Promise 与 axios 结合使用场景及方法 (一)直接返回 axios …

269
2025-08-06

文章目录 一、模块初始化时的内部机制 二、常见导出写法的差异分析 (一)写法一:module.exports…

107
2025-08-06

文章目录 一、ResizeObserver详解 (一)ResizeObserver是什么 (二)ResizeObserver的基本用法 …

683
2025-08-06

文章目录 一、前期准备工作 (一)下载相关文件 (二)安装必要工具 二、处理扣子空间生成的文件…

338
2025-08-06

文章目录 一、官方文档 二、自动解包的数据类型 ref对象:无需.value即可访问 reactive对象:保持…

371
2025-08-06

文章目录 一、Hooks的工作原理 二、在if语句中使用Hook会出什么岔子? 三、React官方的Hook使用规…

843
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号