vue实现淘宝购物车功能
淘宝购物车功能,效果如下图

非常简单的逻辑,没有做代码的封装,代码如下
<div class="list-container">
<div class="top-ops">
<div>
<img src="../../../static/images/HomeRecommendShopInfoAdress@2x.png" alt="">
<span>浙江省杭州市...</span>
</div>
<div class="ops">
<span v-if="cartStatus === 'account'" @click="cartStatus = 'edit'">编辑商品</span>
<span v-if="cartStatus === 'edit'" @click="cartStatus = 'account'">完成</span>
</div>
</div>
<div class="paddingB200">
<div class="shop-list" v-for="(item,index) in cartShops" :key="index">
<div class="shop-name">
<label>
<input type="checkbox"
name="shopRadio"
:value="item.productShopId"
@click="shopCheck($event,cartShops)"
class="disN">
<b></b>
</label>
<div>
<div>
<img src="../../../static/images/mall@2x.png" alt="">
<span class="name">{{item.shopName}}</span>
</div>
<span>
<img src="../../../static/images/jtxq@2x.png" alt="">
</span>
</div>
</div>
<div class="goods-list" v-for="(goods,goodsIndex) in item.detailLists" :key="goodsIndex">
<label>
<input type="checkbox"
name="goodRadio"
:price="goods.price"
:num="goods.number" :dataId="item.productShopId"
:value="goods.cartDetailId"
@click="goodsCkeck($event,item.detailLists,cartShops,item.productShopId)"
class="disN">
<b></b>
</label>
<div class="middle">
<img :src="goods.reportImage" alt="">
<div>
<p class="name">{{goods.name}}</p>
<p class="spec">{{goods.specifications}}</p>
<p class="tab">
<img src="../../../static/images/lsspbq@2x.png" alt="">
</p>
</div>
</div>
<div class="right">
<p class="price">¥{{goods.price}}</p>
<p class="num">X{{goods.number}}</p>
<p class="caculate">
<span class="mark" @click="numDecrease(goods.number)"></span>
<span class="beeforCacul">{{goods.number}}</span>
<span class="cacul" :num="goods.cartDetailId">{{goods.number}}</span>
<span class="mark" @click="numAdd(goods.number)"></span>
</p>
</div>
</div>
</div>
<div class="edit" v-if="cartStatus === 'edit'">
<label>
<input type="checkbox" name="allRadio" class="disN" @click="allCheck($event)">
<b></b>
<span>全选</span>
</label>
<span class="delet">删除(3)</span>
</div>
<div class="gotopay" v-if="cartStatus === 'account'">
<label>
<input type="checkbox" name="allRadio" class="disN" @click="allCheck($event)">
<b></b>
<span class="marginR40">全选</span>
<span>合计:</span>
<span class="sum">¥{{sumPrice.toFixed(2)}}</span>
</label>
<span class="delet" @click="cauSum">去结算({{totalNumber}})</span>
</div>
</div>
</div>
export default {
    components: {
    },
    name: "life",
    data() {
        return {
            cartStatus:"account",  //购物车状态,account结算,edit删除编辑状态
            cartShops: [],  //店铺列表
            sumPrice:0,  //合计金额
            totalNumber: 0, //总数
            shopList:[],  //店铺列表
            goodsList:[],  //商品列表
        };
    },
    watch: {
    },
    mounted() {
        this.getCartDetail();
    },
    methods: {
        //购物车列表
        getCartDetail: function(){
            this.$http.get("api/product/v1/getCartDetail").then( res => {
                if(res.data.code === 200){
                    //console.log(res.data.data)
                    this.cartShops = res.data.data.cartShops;
                }else{
                    Toast(res.data.msg);
                }
            }).catch( error => {
                console.log(error)
            })
        },
        //商品选择
        goodsCkeck: function(event,goodsList,shopList,shopId){
            //商品列表+-,店铺是否checked(店铺列表+-),全选是否checked
            var input = document.getElementsByTagName('input')
            if(event.currentTarget.checked){
                this.goodsList.push(String(event.currentTarget.value));
                //如果店铺内所有商品全选,店铺选中
                var newArr = this.goodsList;
                var tt = goodsList.every(function(itemValue){
                    return (newArr.indexOf(String(itemValue.cartDetailId)) != -1)
                })
                if(tt){
                    //店铺内全选,店铺checked,店铺列表+
                    for(var i = 0;i<input.length;i++){
                        if(input[i].value == shopId){
                            input[i].checked = true;
                        }
                    }
                    this.shopList.push(String(shopId)); //防止shopid是number类型造成麻烦
                    //如果所有店铺都全选,则全选按钮checked
                    if(this.shopList.length === shopList.length){
                        //所有店铺全选
                        for(var i = 0;i<input.length;i++){
                            if(input[i].name == 'allRadio'){
                                input[i].checked = true;
                            }
                        }
                    }
                }
            }else{
                //商品列表--
                this.goodsList.splice(this.goodsList.indexOf(event.currentTarget.value),1)
                //如果店铺checked,则取消,店铺列表--
                for(var i = 0;i<input.length;i++){
                    if(input[i].value == shopId){
                        if(input[i].checked){
                            input[i].checked = false;
                            this.shopList.splice(this.shopList.indexOf(String(shopId)),1); //防止shopid是number类型造成麻烦
                        }
                    }
                    //任意一个不选,全选取消
                    if(input[i].name == 'allRadio'){
                        input[i].checked = false;
                    }
                }
            }
            //计算总价和数量
            this.caculate();
        },
        //店铺选择
        shopCheck: function(event,shopList){
            //店铺选中则对应商品全选,否则全不选
            //console.log(event.currentTarget)
            var input = document.getElementsByTagName('input')
            if(event.currentTarget.checked){
                //店铺列表+,店铺checked,店铺内商品全checked,商品列表++
                //console.log(this.shopList)
                this.shopList.push(String(event.currentTarget.value));
                //店铺内商品全checked
                for(var i = 0;i<input.length;i++){
                    if(input[i].getAttribute('dataId') == event.currentTarget.value){
                        //将没有选中的checked,并加入列表,去重
                        if(!input[i].checked){
                            input[i].checked = true;
                            //商品列表++
                            this.goodsList.push(String(input[i].value))
                        }
                    }
                }
                //所有店铺全选
                if(this.shopList.length === shopList.length){
                    for(var i = 0;i<input.length;i++){
                        if(input[i].name == 'allRadio'){
                            input[i].checked = true;
                        }
                    }
                }
            }else{
                //店铺取消checked,店铺列表--,店铺内所有商品取消checked,商品列表--
                this.shopList.splice(this.shopList.indexOf(String(event.currentTarget.value)),1);
                //店铺内所有商品取消checked
                for(var i = 0;i<input.length;i++){
                    if(input[i].getAttribute('dataId') == event.currentTarget.value){
                        input[i].checked = false;
                        //商品列表--
                        this.goodsList.splice(this.goodsList.indexOf(input[i].value),1);
                    }
                    //任意一个不选,全选取消
                    if(input[i].name == 'allRadio'){
                        input[i].checked = false;
                    }
                }
            }
            //计算总价和数量
            this.caculate();
        },
        //所有全选
        allCheck: function(event){
            var input = document.getElementsByTagName('input')
            if(event.currentTarget.checked){
                //全选checked,所有店铺checked,店铺列表++,所有商品checked,商品列表++
                for(var i = 0;i<input.length;i++){
                    //去重
                    if(!input[i].checked){
                        input[i].checked = true;
                        if(input[i].name == 'shopRadio'){
                            this.shopList.push(String(input[i].value))
                        }
                        if(input[i].name == 'goodRadio'){
                            this.goodsList.push(String(input[i].value))
                        }
                    }
                }
            }else{
                //全不选取消checked,店铺全部取消checked,店铺列表清空,所有商品取消checked,商品列表清空
                for(var i = 0;i<input.length;i++){
                    input[i].checked = false;
                    this.shopList = [];
                    this.goodsList = [];
                }
            }
            //计算总价和数量
            this.caculate();
        },
        //计算总金额总数量
        caculate: function(){
            var input = document.getElementsByTagName('input');
            var newArr = [];
            for(var i = 0;i<input.length;i++){
                if(input[i].name == 'goodRadio' && input[i].checked){
                    var num = input[i].parentNode.parentNode.children[2].children[2].children[2].innerHTML;
                    newArr.push(
                        {
                            'price': input[i].getAttribute('price'),
                            'num': num
                        }
                    )
                }
            }
            this.totalNumber = newArr.length;
            //归零
            this.sumPrice = 0;
            for(var j = 0,len = newArr.length;j<len;j++){
                this.sumPrice += newArr[j].price * newArr[j].num;
            }
        },
        //数量减小
        numDecrease: function(num){
            //如果当前input选中,则修改数量计算价格,如果当前input没有选中,则修改数量不计算价格
            var spanList = event.currentTarget.parentNode.children;
            for(var i = 0,len = spanList.length;i<len;i++){
                if(spanList[i].getAttribute("class") == 'beeforCacul'){
                    spanList[i].style.display = 'none';
                }
                if(spanList[i].getAttribute("class") == 'cacul'){
                    spanList[i].style.display = 'block';
                    var caculNum = spanList[i].innerHTML;
                    if(caculNum < 2){
                        Toast('宝贝不能再少了哦');
                    }else{
                        caculNum --
                        spanList[i].innerHTML = caculNum;
                    }
                }
            }
            if(event.currentTarget.parentNode.parentNode.parentNode.children[0].children[0].checked){
                this.caculate();
            }
        },
        //数量增加
        numAdd: function(num){
            var spanList = event.currentTarget.parentNode.children;
            //console.log(event.currentTarget.parentNode.children)
            for(var i = 0,len = spanList.length;i<len;i++){
                if(spanList[i].getAttribute("class") == 'beeforCacul'){
                    spanList[i].style.display = 'none';
                }
                if(spanList[i].getAttribute("class") == 'cacul'){
                    spanList[i].style.display = 'block';
                    var caculNum = spanList[i].innerHTML;
                    caculNum ++;
                    spanList[i].innerHTML = caculNum;
                }
            }
            if(event.currentTarget.parentNode.parentNode.parentNode.children[0].children[0].checked){
                this.caculate();
            }
        },
        //去结算
        cauSum:function(){
            if(this.sumPrice === 0){
                Toast('您还没有选择宝贝哦');
            }else{
                this.$router.push('/cart/order')
            }
        },
    }
};
vue实现淘宝购物车功能的更多相关文章
- android ------ RecyclerView 模仿淘宝购物车
		
电商项目中常常有购物车这个功能,做个很多项目了,都有不同的界面,选了一个来讲一下. RecyclerView 模仿淘宝购物车功能(删除选择商品,商品计算,选择, 全选反选,商品数量加减等) 看看效果图 ...
 - 淘宝购物车页面 智能搜索框Ajax异步加载数据
		
如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区 ...
 - 淘宝购物车页面 PC端和移动端实战
		
最近花了半个月的时间,做了一个淘宝购物车页面的Demo.当然,为了能够更加深入的学习,不仅仅有PC端的固定宽度的布局,还实现了移动端在Media Query为768px以下(也就是实现了ipad,ip ...
 - 仿淘宝购物车demo---增加和减少商品数量
		
在上一篇博客中,小编简单的介绍了如何使用listview来实现购物车,但是仅仅是简单的实现了列表的功能,随之而来一个新的问题,买商品的时候,我们可能不止想买一件商品,想买多个,或许有因为某种原因点错了 ...
 - jQuery实现淘宝购物车小组件
		
我爱撸码,撸码使我感到快乐! 大家好,我是Counter,本章将实现淘宝购物车小组件, 用原生js可以实现吗,当然可以,可是就是任性一回,就是想用jQuery 来实现下.HTML代码不多才4行,CSS ...
 - vue+vue-cli+淘宝lib-flexible做移动端自适应
		
总结用vue+vue-cli+淘宝lib-flexible做移动端自适应方案: 1.安装淘宝lib-flexible npm install lib-flexible --save 2.在入口文价ma ...
 - web——自己实现一个淘宝购物车页面
		
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
 - Vue(小案例_vue+axios仿手机app)_购物车(二模拟淘宝购物车页面,点击加减做出相应变化)
		
一.前言 在上篇购物车中,如果用户刷新了当前的页面,底部导航中的数据又会恢复为原来的: 1.解决刷新,购物车上数值不变 ...
 - vue实现结算淘宝购物车效果
		
实现单选时的价格,全选时价格 单选效果图 全选效果图 html <template> <!-- 淘宝结算购物车 --> <div class="settleme ...
 
随机推荐
- UVA11992 Fast Matrix Operations
			
思路 注意到最多20行,拆成20颗线段树即可 注意set标记清空左右儿子的add,不要清空自己的add,因为这个set操作之后可能还有add存在这个节点上 代码 #include <cstdio ...
 - ABAP search help (搜索帮助) 几种种方法
			
ABAP search help (搜索帮助) 几种种方法 域范围 ABAP 的搜索帮助有很多种方法,掌握下面的几种基本差不多了 *&------------------------- ...
 - Perl调用外部命令(其他脚本、系统命令)的方法和区别
			
1. `command`; 使用反引号调用外部命令能够捕获其标准输出,并按行返回且每行结束处附带一个回车.反引号中的变量在编译时会被内插为其值. 2. open LIST "ls -l| ...
 - spring-data-jpa——如果使用了one-to-many,many-to-one的注解,在Jackson进行json字符串化时出现错误的解决方案
			
参考资料: http://blog.csdn.net/remote_roamer/article/details/51330843 http://blog.csdn.net/xiaodaiye/art ...
 - 由装饰者模式来深入理解Java I/O整体框架
			
前言 Java里面的I/O这一部分看过很多遍,每次看完之后特别混乱,又是输入流,又是输出流,又是字符流,又是字节流,还有什么过滤流,缓冲流.每次看得我如入云里雾里,直到后面看了设计模式这一块,才算真正 ...
 - Node.js简述
			
Node.js是2009年5月由Ryan Dahl 发布的服务器程序. 它封装了Google V8 JavaScript 引擎, 并将其重建为可在服务器上使用. 它旨在提供一种简单的构建可伸缩网络程序 ...
 - 【OS】Heap & Stack
			
操作系统概念的堆.栈不同于数据结构的堆.栈. C 语言中,一切指针占 4 字节,这意味着指针指向 RAM 中的地址可以有 232 个,最小的地址是 0,最大的地址是 231 - 1. (一)堆: 堆空 ...
 - MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本
			
本文主要讲述如何安装 C语言 编译器——MinGW-w64,特点是文章附有完整详细的实际安装过程截图,文字反而起说明提示作用. 编写本文的原因始于我的一个观点:图片可以比文字传达更多的信息,也能让其他 ...
 - unity中实现场景之间加载进度条
			
using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; using UnityEngine.UI ...
 - jQuery-----隔行换色/全选全不选/
			
隔行换色: 全选全不选: 分析: 1.页面加载 $(function(){}) 2.获取所有奇数行数 ...