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 ...
随机推荐
- bzoj2124: 等差子序列线段树+hash
bzoj2124: 等差子序列线段树+hash 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2124 思路 找大于3的等差数列其实就是找等于 ...
- IdentityServer4 错误解决方案
错误 解决方案 Grant types list cannot contain both xx and xx 以下授权类型不能同时存在: Implicit AuthorizationCode Impl ...
- 由 UWP 版网易云音乐闪退引发的博文
今天,不知怎么的.网易云音乐出现了一打开就闪退的情况.百度了好些时候未果,就直接 Windows + i 打开 Windows 设置 > 应用 在应用和功能列表中找到网易云音乐,在展开的 高级选 ...
- PHP深入浅出之命名空间(Namespace)的使用详解
对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...
- CookieHelper
using System.Web: /// <summary> /// CookieHelper /// </summary> public static class Cook ...
- ssm+redis整合(通过cache方式)
这几天的研究ssm redis 终于进入主题了,今天参考了网上一些文章搭建了一下ssm+redis整合,特别记录下来以便以后可以查询使用,有什么不足请大牛们提点 项目架构 1.pom.xml < ...
- 浅谈Final
Java关键字final有“这是无法改变的”或者“终态的”含义,final可以修饰非抽象类.非抽象类成员方法和变量. final类不能被继承,没有子类,final类中的方法默认是final的.fina ...
- [Oracle] 使用PL/SQL Developer 连接远程数据库
1.在登录界面选择: Database改成xxx.xxx.xxx.xxx/ORCL,如果数据库不是默认的ORCL,那么就改成相应的数据库名. 2.如果失败: 修改ORACLE安装目录下的\produc ...
- LeetCode--038--报数(java)
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1. 1 2. 11 3. 21 4. 1211 5. 111221 1 被读作 "one 1" ...
- 深入理解Plasma(二)Plasma 细节
这一系列文章将围绕以太坊的二层扩容框架,介绍其基本运行原理,具体操作细节,安全性讨论以及未来研究方向等.本篇文章主要对 Plasma 一些关键操作的细节进行剖析. 在上一篇文章中我们已经理解了什么是 ...