vue实例-购物车功能

以下为该购物车的效果图,能够对购物车中的商品进行勾选/全选、商品的自增自减、自动结算功能以及单独删除和批量删除的功能。

下列为代码具体步骤解说(搭建完结构的基础上):
1.通过for循环输出数组中的对象并填充到html结构中,在循环的时候加入index索引为了方便删除单条数据的时候更快的找到该条数据在数组中对应的位置。将input绑定item.pro_num,然后自增自减只需要判断item.pro_num--或者是item.pro_num++即可;在判断输入框中的数值时顺带计算该条内容的总价,即为item.pro_num*item.pro_price;
js:
2.由于后台在给数据的时候并不会标记该条记录是否被选中,所以我们自己在mounted中给productList加一个select属性来表示是否勾选,每条内容则可添加@click="item.select=!item.select"来进行选中和取消选中的效果,选中的添加一个select_true类名。
3.当select属性有了,就可以判断全选了:
用一个isSelectAll来判断是否全选,如果productList的长度为0的话,则返回false不全选;然后通过every来逐个判断select是否为true,如果为true的话,则全选;
点击全选时,通过for循环来遍历出所有的select,使所有的select = !isSelectAll
4.再来就是勾选的数目以及所有的总价的计算了
5.最后,剩下删除功能,删除单个的话,很简单,只需要找到对应的index索引,然后通过splice()则可轻松实现;批量删除的话,则需要找到数组中select=false的数据,然后将productList数据替换为select=false的数据即可。

功能的解说已经完成了,最后贴上详细代码~

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <script src="../js/vue.min.js"></script>
    </head>
    <body>
        <!-- 购物车自增自减、价格统计、全选 -->
        <style>
            .fl {
                float: left;
            }
            .fr {
                float: right;
            }
            blockquote, body, dd, div, dl, dt, fieldset, form, h1, h2, h3, h4, h5, h6, img, input, li, ol, p, table, td, textarea, th, ul {
                margin: 0;
                padding: 0;
            }
            .clearfix {
              zoom: 1;
            }
            .clearfix:after {
                clear: both;
            }
            .clearfix:after {
                content: '.';
                display: block;
                overflow: hidden;
                visibility: hidden;
                font-size: 0;
                line-height: 0;
                width: 0;
                height: 0;
            }
            a {
                text-decoration: none;
                color: #333;
            }
            img {
                vertical-align: middle;
            }
            .page-shopping-cart {
                width: 1200px;
                margin: 50px auto;
                font-size: 14px;
                border: 1px solid #e3e3e3;
                border-top: 2px solid #317ee7; 
            }
            .page-shopping-cart .cart-title {
                color: #317ee7;
                font-size: 16px;
                text-align: left;
                padding-left: 20px;
                line-height: 68px;
            }
            .page-shopping-cart .red-text {
                color: #e94826; 
            }
            .page-shopping-cart .check-span {
                display: block;
                width: 24px;
                height: 20px;
                background: url("shopping_cart.png") no-repeat 0 0; 
            }
            .page-shopping-cart .check-span.check-true {
                background: url("shopping_cart.png") no-repeat 0 -22px; 
            }
            .page-shopping-cart .td-check {
                width: 70px; 
            }
            .page-shopping-cart .td-product {
                width: 460px; 
            }
            .page-shopping-cart .td-num, .page-shopping-cart .td-price, .page-shopping-cart .td-total {
                width: 160px; 
            }
            .page-shopping-cart .td-do {
                width: 150px; 
            }
            .page-shopping-cart .cart-product-title {
                text-align: center;
                height: 38px;
                line-height: 38px;
                padding: 0 20px;
                background: #f7f7f7;
                border-top: 1px solid #e3e3e3;
                border-bottom: 1px solid #e3e3e3; 
            }
            .page-shopping-cart .cart-product-title .td-product {
                text-align: center;
                font-size: 14px; 
            }
            .page-shopping-cart .cart-product-title .td-check {
                text-align: left; 
            }
            .page-shopping-cart .cart-product-title .td-check .check-span {
                margin: 9px 6px 0 0; 
            }
            .page-shopping-cart .cart-product {
                padding: 0 20px;
                text-align: center; 
            }
            .page-shopping-cart .cart-product table {
                width: 100%;
                text-align: center;
                font-size: 14px; 
            }
            .page-shopping-cart .cart-product table td {
                padding: 20px 0; 
            }
            .page-shopping-cart .cart-product table tr {
                border-bottom: 1px dashed #e3e3e3; 
            }
            .page-shopping-cart .cart-product table tr:last-child {
                border-bottom: none; 
            }
            .page-shopping-cart .cart-product table .product-num {
                border: 1px solid #e3e3e3;
                display: inline-block;
                text-align: center; 
            }
            .page-shopping-cart .cart-product table .product-num .num-do {
                width: 24px;
                height: 28px;
                display: block;
                background: #f7f7f7; 
            }
            .page-shopping-cart .cart-product table .product-num .num-reduce span {
                background: url("shopping_cart.png") no-repeat -40px -22px;
                display: block;
                width: 6px;
                height: 2px;
                margin: 13px auto 0 auto; 
            }
            .page-shopping-cart .cart-product table .product-num .num-add span {
                background: url("shopping_cart.png") no-repeat -60px -22px;
                display: block;
                width: 8px;
                height: 8px;
                margin: 10px auto 0 auto;
            }
            .page-shopping-cart .cart-product table .product-num .num-input {
                width: 42px;
                height: 28px;
                line-height: 28px;
                border: none;
                text-align: center; 
            }
            .page-shopping-cart .cart-product table .td-product {
                text-align: left;
                font-size: 12px;
                line-height: 20px; 
            }
            .page-shopping-cart .cart-product table .td-product img {
                border: 1px solid #e3e3e3;
                margin-right: 10px; 
            }
            .page-shopping-cart .cart-product table .td-product .product-info {
                display: inline-block;
                vertical-align: middle; 
            }
            .page-shopping-cart .cart-product table .td-do {
                font-size: 12px; 
            }
            .page-shopping-cart .cart-product-info {
                height: 50px;
                line-height: 50px;
                background: #f7f7f7;
                padding-left: 20px; 
            }
            .page-shopping-cart .cart-product-info .delect-product {
                color: #666; 
            }
            .page-shopping-cart .cart-product-info .delect-product span {
                display: inline-block;
                vertical-align: top;
                margin: 18px 8px 0 0;
                width: 13px;
                height: 15px;
                background: url("shopping_cart.png") no-repeat -60px 0; 
            }
            .page-shopping-cart .cart-product-info .product-total {
                font-size: 14px;
                color: #e94826; 
            }
            .page-shopping-cart .cart-product-info .product-total span {
                font-size: 20px; 
            }
            .page-shopping-cart .cart-product-info .check-num {
                color: #333; 
            }
            .page-shopping-cart .cart-product-info .check-num span {
                color: #e94826; 
            }
            .page-shopping-cart .cart-product-info .keep-shopping {
                color: #666;
                margin-left: 40px; 
            }
            .page-shopping-cart .cart-product-info .keep-shopping span {
                display: inline-block;
                vertical-align: top;
                margin: 18px 8px 0 0;
                width: 15px;
                height: 15px;
                background: url("shopping_cart.png") no-repeat -40px 0; 
            }
            .page-shopping-cart .cart-product-info .btn-buy {
                height: 50px;
                color: #fff;
                font-size: 20px;
                display: block;
                width: 110px;
                background: #ff7700;
                text-align: center;
                margin-left: 30px; 
            }
            .page-shopping-cart .cart-worder {
                padding: 20px; 
            }
            .page-shopping-cart .cart-worder .choose-worder {
                color: #fff;
                display: block;
                background: #39e;
                width: 140px;
                height: 40px;
                line-height: 40px;
                border-radius: 4px;
                text-align: center;
                margin-right: 20px; 
            }
            .page-shopping-cart .cart-worder .choose-worder span {
                display: inline-block;
                vertical-align: top;
                margin: 9px 10px 0 0;
                width: 22px;
                height: 22px;
                background: url("shopping_cart.png") no-repeat -92px 0; 
            }
            .page-shopping-cart .cart-worder .worker-info {
                color: #666; 
            }
            .page-shopping-cart .cart-worder .worker-info img {
                border-radius: 100%;
                margin-right: 10px; 
            }
            .page-shopping-cart .cart-worder .worker-info span {
                color: #000; 
            }
            .choose-worker-box {
                width: 620px;
                background: #fff; 
            }
            .choose-worker-box .box-title {
                height: 40px;
                line-height: 40px;
                background: #F7F7F7;
                text-align: center;
                position: relative;
                font-size: 14px; 
            }
            .choose-worker-box .box-title a {
                display: block;
                position: absolute;
                top: 15px;
                right: 16px;
                width: 10px;
                height: 10px;
                background: url("shopping_cart.png") no-repeat -80px 0; 
            }
            .choose-worker-box .box-title a:hover {
                background: url("shopping_cart.png") no-repeat -80px -22px; 
            }
            .choose-worker-box .worker-list {
                padding-top: 30px;
                height: 134px;
                overflow-y: auto; 
            }
            .choose-worker-box .worker-list li {
                float: left;
                width: 25%;
                text-align: center;
                margin-bottom: 30px; 
            }
            .choose-worker-box .worker-list li p {
                margin-top: 8px; 
            }
            .choose-worker-box .worker-list li.cur a {
                color: #f70; 
            }
            .choose-worker-box .worker-list li.cur a img {
                border: 1px solid #f70; 
            }
            .choose-worker-box .worker-list li a:hover {
                color: #f70; 
            }
            .choose-worker-box .worker-list li a:hover img {
                border: 1px solid #f70; 
            }
            .choose-worker-box .worker-list li img {
                border: 1px solid #fff;
                border-radius: 100%; 
            }
        </style>
        <div class="page-shopping-cart" id="shopping-cart">
            <h4 class="cart-title">购物清单</h4>
            <div class="cart-product-title clearfix">
                <div class="td-check fl"><span class="check-span fl check-all" :class="{'check-true':isSelectAll}" @click="selectOrNot(isSelectAll)"></span>全选</div>
                <div class="td-product fl">商品</div>
                <div class="td-num fl">数量</div>
                <div class="td-price fl">单价(元)</div>
                <div class="td-total fl">金额(元)</div>
                <div class="td-do fl">操作</div>
            </div>
            <div class="cart-product clearfix">
                <table>
                    <tbody>
                        <!-- 加入index用于删除的时候判断索引 -->
                        <tr v-for="(item,index) in productList">
                            <td class="td-check"><span class="check-span" :class="{'check-true':item.select}" @click="item.select=!item.select"></span></td>
                            <td class="td-product"><img src="../images/1.png" width="98" height="98">
                                <div class="product-info">
                                    <h6>{{item.pro_name}}</h6>
                                    <p>品牌:{{item.pro_brand}}&nbsp;&nbsp;产地:{{item.pro_place}}</p>
                                    <p>规格/纯度:{{item.pro_purity}}&nbsp;&nbsp;起定量:{{item.pro_min}}</p>
                                    <p>配送仓储:{{item.pro_depot}}</p>
                                </div>
                                <div class="clearfix"></div>
                            </td>
                            <td class="td-num">
                                <div class="product-num">
                                    <a href="javascript:;" class="num-reduce num-do fl" @click="item.pro_num>0?item.pro_num--:''"><span></span></a>
                                    <input type="text" class="num-input" value="3" v-model="item.pro_num">
                                    <a href="javascript:;" class="num-add num-do fr" @click="item.pro_num++"><span></span></a>
                                </div>
                            </td>
                            <td class="td-price">
                                <p class="red-text">¥<span class="price-text">800</span>.00</p>
                            </td>
                            <td class="td-total">
                                <p class="red-text">¥<span class="total-text">{{item.pro_num*item.pro_price}}</span>.00</p>
                            </td>
                            <td class="td-do"><a href="javascript:;" class="product-delect" @click="deleteOne(index)">删除</a></td>
                        </tr>
                    </tbody>
                </table>
            </div>
            <div class="cart-product-info">
                <a class="delect-product" href="javascript:;" @click="deleteSome"><span></span>删除所选商品</a>
                <a class="keep-shopping" href="#"><span></span>继续购物</a>
                <a class="btn-buy fr" href="javascript:;">去结算</a>
                <p class="fr product-total">¥<span>{{total.totalPrice}}</span></p>
                <p class="fr check-num"><span>{{total.totalNum}}</span>件商品总计(不含运费):</p>
            </div>
            <div class="cart-worder clearfix">
                <a href="javascript:;" class="choose-worder fl"><span></span>绑定跟单员</a>
                <div class="worker-info fl">
                </div>
            </div>
        </div>
        <script>
            new Vue({
                el:'#shopping-cart',
                data:{
                    productList: [
                        {
                            'pro_name': '【斯文】甘油 | 丙三醇',//产品名称
                            'pro_brand': 'skc',//品牌名称
                            'pro_place': '韩国',//产地
                            'pro_purity': '99.7%',//规格
                            'pro_min': "215千克",//最小起订量
                            'pro_depot': '上海仓海仓储',//所在仓库
                            'pro_num': 3,//数量
                            'pro_img': '../../images/ucenter/../images/1.png',//图片链接
                            'pro_price': 800//单价
                        },
                        {
                            'pro_name': '【斯文】甘油 | 丙三醇',//产品名称
                            'pro_brand': 'skc',//品牌名称
                            'pro_place': '韩国',//产地
                            'pro_purity': '99.7%',//规格
                            'pro_min': "215千克",//最小起订量
                            'pro_depot': '上海仓海仓储',//所在仓库
                            'pro_num': 3,//数量
                            'pro_img': '../../images/ucenter/../images/1.png',//图片链接
                            'pro_price': 800//单价
                        },
                        {
                            'pro_name': '【斯文】甘油 | 丙三醇',//产品名称
                            'pro_brand': 'skc',//品牌名称
                            'pro_place': '韩国',//产地
                            'pro_purity': '99.7%',//规格
                            'pro_min': "215千克",//最小起订量
                            'pro_depot': '上海仓海仓储',//所在仓库
                            'pro_num': 3,//数量
                            'pro_img': '../../images/ucenter/../images/1.png',//图片链接
                            'pro_price': 800//单价
                        }
                    ]
                },
                computed: {
                    // 检测是否全选
                    isSelectAll:function(){
                        if(this.productList.length <= 0){
                            return false;
                        }
                        return this.productList.every(function(val){
                            return val.select;
                        })
                    },
                    total: function(){
                        var _pro = this.productList.filter(function(val){return val.select});
                        var totalPrice = 0;
                        for(var i = 0; i < _pro.length; i++){
                            totalPrice += _pro[i].pro_num * _pro[i].pro_price;
                        }
                        return {totalNum:_pro.length,totalPrice:totalPrice}
                    }
                },
                methods:{
                    // 全选与取消全选
                    selectOrNot:function(_select){
                        for(var i = 0; i < this.productList.length; i++){
                            this.productList[i].select = !_select;
                        }
                    },
                    // 单个删除
                    deleteOne:function(index){
                        this.productList.splice(index,1);
                    },
                    // 批量删除
                    deleteSome: function(){
                        this.productList = this.productList.filter(function(val){
                            return !val.select
                        })
                    }
                },
                mounted: function(){
                    var _this = this;
                    this.productList.map(function(item){
                        _this.$set(item,'select',true);
                    })
                }
            })
        </script>
    </body>
</html>复制代码




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值