1 index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!-- Always force latest IE rendering engine or request Chrome Frame -->
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<title>购物车</title>
<link href="css/base2.css" rel="stylesheet" >
<link href="css/checkout.css" rel="stylesheet" >
<link href="css/modal.css" rel="stylesheet" >
<style>
.quentity input{
width: 40px;
padding: 5px 10px;
text-align: center;
}
.partContent{
width:100px;
height: 50px;
} .partContent .left{
width:50px;
height:50px;
display: table-cell;
vertical-align: middle;
text-align: center;
float:left;
}
.partContent .right{
width:50px;
height: 50px;
float:left;
cursor:pointer;
}
</style>
</head>
<body class="checkout">
<div id="app">
<svg style="position: absolute; width: 0; height: 0; overflow: hidden;" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<symbol id="icon-add" viewBox="0 0 32 32">
<title>add2</title>
<path class="path1" d="M15 17h-13.664c-0.554 0-1.002-0.446-1.002-1 0-0.552 0.452-1 1.002-1h13.664v-13.664c0-0.554 0.446-1.002 1-1.002 0.552 0 1 0.452 1 1.002v13.664h13.664c0.554 0 1.002 0.446 1.002 1 0 0.552-0.452 1-1.002 1h-13.664v13.664c0 0.554-0.446 1.002-1 1.002-0.552 0-1-0.452-1-1.002v-13.664z"></path>
</symbol>
<symbol id="icon-ok" viewBox="0 0 39 32">
<title>ok</title>
<path class="path1" d="M14.084 20.656l-7.845-9.282c-1.288-1.482-3.534-1.639-5.016-0.351s-1.639 3.534-0.351 5.016l10.697 12.306c1.451 1.669 4.057 1.623 5.448-0.096l18.168-22.456c1.235-1.527 0.999-3.765-0.528-5.001s-3.765-0.999-5.001 0.528l-15.573 19.337z"></path>
</symbol>
<symbol id="icon-edit" viewBox="0 0 32 32">
<title>edit</title>
<path class="path1" d="M25.599 11.292l-4.892-4.892 3.825-3.825 4.892 4.892-3.825 3.825zM4.732 23.308l3.959 3.959-5.939 1.98 1.98-5.939zM10.666 26.225l-4.892-4.892 13.425-13.425 4.892 4.892-13.425 13.425zM31.687 6.713l-6.4-6.4c-0.417-0.417-1.091-0.417-1.508 0l-20.267 20.267c-0.114 0.115-0.191 0.25-0.242 0.393-0.003 0.009-0.012 0.015-0.015 0.025l-3.2 9.6c-0.128 0.383-0.029 0.806 0.257 1.091 0.203 0.204 0.476 0.313 0.754 0.313 0.112 0 0.227-0.017 0.337-0.054l9.6-3.2c0.011-0.003 0.017-0.013 0.027-0.016 0.142-0.052 0.276-0.128 0.39-0.242l20.267-20.267c0.417-0.416 0.417-1.091 0-1.508v0z"></path>
</symbol>
<symbol id="icon-del" viewBox="0 0 26 32">
<title>delete</title>
<path class="path1" d="M17.723 28c0.543 0 0.984-0.448 0.984-1v-12c0-0.552-0.441-1-0.984-1s-0.985 0.448-0.985 1v12c0 0.552 0.441 1 0.985 1v0zM7.877 28c0.543 0 0.984-0.448 0.984-1v-12c0-0.552-0.441-1-0.984-1s-0.985 0.448-0.985 1v12c0 0.552 0.441 1 0.985 1v0zM12.8 28c0.543 0 0.985-0.448 0.985-1v-12c0-0.552-0.441-1-0.985-1s-0.984 0.448-0.984 1v12c0 0.552 0.441 1 0.984 1v0zM23.631 4h-5.908v-2c0-1.104-0.882-2-1.969-2h-5.908c-1.087 0-1.969 0.896-1.969 2v2h-5.908c-1.087 0-1.969 0.896-1.969 2v2c0 1.104 0.882 2 1.969 2v18c0 2.208 1.765 4 3.939 4h13.784c2.174 0 3.938-1.792 3.938-4v-18c1.087 0 1.969-0.896 1.969-2v-2c0-1.104-0.882-2-1.969-2v0zM9.846 3c0-0.552 0.441-1 0.984-1h3.938c0.544 0 0.985 0.448 0.985 1v1h-5.908v-1zM21.662 28c0 1.104-0.882 2-1.969 2h-13.784c-1.087 0-1.97-0.896-1.97-2v-18h17.723v18zM22.646 8h-19.692c-0.543 0-0.985-0.448-0.985-1s0.441-1 0.985-1h19.692c0.543 0 0.984 0.448 0.984 1s-0.441 1-0.984 1v0z"></path>
</symbol>
<symbol id="icon-clock" viewBox="0 0 32 32">
<title>clock</title>
<path class="path1" d="M29.333 16c0-7.364-5.97-13.333-13.333-13.333s-13.333 5.97-13.333 13.333c0 7.364 5.97 13.333 13.333 13.333s13.333-5.97 13.333-13.333v0 0 0 0 0 0zM0 16c0-8.837 7.163-16 16-16s16 7.163 16 16c0 8.837-7.163 16-16 16s-16-7.163-16-16zM14.667 14.667v1.333h2.667v-10.667h-2.667v9.333zM24 18.667h1.333v-2.667h-10.667v2.667h9.333z"></path>
</symbol>
</defs>
</svg> <div class="container">
<div class="cart">
<div class="checkout-title">
<span>购物车</span>
</div> <!-- table -->
<div class="item-list-wrap">
<div class="cart-item">
<div class="cart-item-head">
<ul>
<li>商品信息</li>
<li>商品金额</li>
<li>商品数量</li>
<li>总金额</li>
<li>编辑</li>
</ul>
</div>
<!--购物车商品列表 start-->
<ul class="cart-item-list">
<li v-for="(item, key, index) in productList">
<div class="cart-tab-1">
<div class="cart-item-check">
<a href="javascript:void 0" class="item-check-btn"
v-bind:class="{'check':item.checked}" @click="selectedProduct(item)">
<svg class="icon icon-ok"><use xlink:href="#icon-ok"></use></svg>
</a>
</div>
<div class="cart-item-pic">
<img v-bind:src="item.productImage" v-bind:alt="item.productName">
</div>
<div class="cart-item-title">
<div class="item-name">{{item.productName}}</div>
</div>
<div class="item-include">
<dl>
<dt>赠送:</dt>
<dd v-for="part in item.parts">
<div class="partContent">
<div class="left">
<span>{{part.partsName}}</span>
</div>
<div class="right">
<img style="width:50px"/>
</div>
</div>
</dd>
</dl>
</div>
</div>
<div class="cart-tab-2">
<div class="item-price">{{item.productPrice | formatMoney}}</div>
</div>
<div class="cart-tab-3">
<div class="item-quantity">
<div class="select-self select-self-open">
<div class="quentity">
<a href="javascript:void 0" @click="changeMoney(item,-1)">-</a>
<input type="text" disabled value="0" v-model="item.productQuentity">
<a href="javascript:void 0" v-on:click="changeMoney(item,1)">+</a>
</div>
</div>
<div class="item-stock">有货</div>
</div>
</div>
<div class="cart-tab-4">
<div class="item-price-total">{{item.productPrice*item.productQuentity | money('元')}}</div>
</div>
<div class="cart-tab-5">
<div class="cart-item-opration">
<a href="javascript:void 0" class="item-edit-btn" @click="delConfirm(item)">
<svg class="icon icon-del"><use xlink:href="#icon-del"></use></svg>
</a>
</div>
</div>
</li>
</ul>
<!--购物车商品列表 end-->
</div>
</div> <!-- footer -->
<div class="cart-foot-wrap">
<div class="cart-foot-l">
<div class="item-all-check">
<a href="javascript:void 0">
<span class="item-check-btn" :class="{check: checkAllFlag}" @click="checkAll(true)">
<svg class="icon icon-ok"><use xlink:href="#icon-ok"></use></svg>
</span>
<span>全选</span>
</a>
</div>
<div class="item-all-del">
<a href="javascript:void 0" class="item-del-btn" @click="checkAll(false)">
取消全选
</a>
</div>
</div>
<div class="cart-foot-r">
<div class="item-total">
总额: <span class="total-price">{{totalAllPrice | money('元')}}</span>
</div>
<div class="next-btn-wrap">
<a href="address.html" class="btn btn--red">结账</a>
</div>
</div>
</div>
</div>
</div> <div class="md-modal modal-msg md-modal-transition" id="showModal" :class="{'md-show':delFlag}">
<div class="md-modal-inner">
<div class="md-top">
<button class="md-close" @click="delFlag=false">关闭</button>
</div>
<div class="md-content">
<div class="confirm-tips">
<p id="cusLanInfo">你确认删除此订单信息吗?</p>
</div>
<div class="btn-wrap col-2">
<button class="btn btn--m" id="btnModalConfirm" @click="delProduct()">确定</button>
<button class="btn btn--m btn--red" id="btnModalCancel" @click="delFlag=false">取消</button>
</div>
</div>
</div>
</div>
<div class="md-overlay" v-show="delFlag"></div>
</div>
<script type="text/javascript" src="node_modules/vue/dist/vue.js"></script>
<script type="text/javascript" src="node_modules/axios/dist/axios.js"></script>
<script type="text/javascript" src="js/cart.js"></script>
</body>
</html>

2 cart.js

/**
* Created by Administrator on 2017/4/2 0002.
*/
// Vue.config.silent = true; 用于取消 Vue 所有的日志与警告
let vmCart = new Vue({
el: '#app',
data: {
totalMoney: 0, //单商品总金额
totalAllPrice: 0, //选择所有商品的总金额
productList: [], //作为商品列表
checkAllFlag: false, //是否全选 存在该变量才能被监听到
delFlag: false, //是否删除
delIndex: '' //保留点击删除哪个li的索引
},
filters: { //局部过滤器
formatMoney: function (value) { //格式化价格格式
return "¥"+value.toFixed(2);
},
},
mounted: function(){ //dom加载完后(生命周期)实例创建后查询某个方法钩子函数--进来之后查询商品
//this.cartView(); //2使用
this.$nextTick(function () {
//mounted不能保证此时new Vue()一定实例化了(使用vmCart可能会报错)
//$nextTick()可以保证一定是实例化后了
vmCart.cartView();
});
},
methods: {
cartView: function(){ //1定义
const _this = this; //这里的this指向vmCart
axios.get('data/cartData.json') //使用axios
.then(function(res){ //then回调函数
// 使用箭头函数的话,this的作用域并不会变,还是指向vmCart
// (res)=>{
// if(res.status == 200){
// this.totalMoney = res.data.result.totalMoney;
// this.list = res.data.result.list;
// }
// }
// 不使用箭头函数的场合
// 如果要使用vmCart实例,
// 就必须在mounted钩子函数里再调用一次$nextTick方法才能保证el被render在dom中
//res 数据库返回的对象
//res.data.result.list 返回的数据数组
//console.log(res);
if(res.status == 200){ //状态为200时执行后面语句
_this.productList = res.data.result.list;
_this.totalMoney = res.data.result.totalMoney;
}
})
.catch(function(err){
console.log('get data error...'); //从数据库获取数据出现问题
});
},
changeMoney: function (item, way) { //商品数量增加和减少
if(way>0){ //点击了+
item.productQuentity++;
}else{ //点击了-
item.productQuentity<=0?item.productQuentity = 0:item.productQuentity--;
}
this.calcTotalPrice();
},
selectedProduct: function (item) {
if(typeof item.checked == 'undefined'){ //判断item.checked是否存在
Vue.set(item, 'checked', true); //向item全局注册了一个属性checked值为true
//this.$set(item, 'checked', true);//局部注册item.checked
}else{ //存在--即至少点击了一次后
item.checked = !item.checked;
};
this.calcTotalPrice();
},
checkAll: function (flag) { //全选/取消全选
this.checkAllFlag = flag;
this.productList.forEach((item, index) => {
//这里存在一个问题当用户直接点击全选
//此时item.check还未存在这个属性 所以要检测一下
if(typeof item.checked == 'undefined'){
//Vue.set(item, 'checked', true);
this.$set(item, 'checked', this.checkAllFlag); //箭头函数内部还是外部作用域的this
}else{
item.checked = this.checkAllFlag;
}
});
this.calcTotalPrice();
},
calcTotalPrice: function () { //计算选中商品总金额函数
this.totalAllPrice = 0;
this.productList.forEach((item, index) => {
if(item.checked){ //说明这个商品选中了
this.totalAllPrice += item.productPrice*item.productQuentity;
}
})
},
delConfirm: function (item) { //点击删除按钮
this.delFlag = true;
this.delIndex = item;
},
delProduct: function () { //删除点击了删除的商品
let index = this.productList.indexOf(this.delIndex);
this.productList.splice(index,1);
//vue2开始认为js就有删除数组的方法故自己写操作
//实际项目中需要把这个商品的信息传递到后台
this.delFlag = false;
}
}
}); Vue.filter('money', (value, type) => { //全局过滤器
return "¥"+ value.toFixed(2) + type;
});

3 自己理解

vue2购物车ch3-(过滤器使用 单件商品金额计算 全选全不选 总金额计算 删除商品功能)的更多相关文章

  1. vue2购物车ch2-(商品列表显示)

    1 index.html <!DOCTYPE html><html lang="en"><head> <meta charset=&quo ...

  2. vue2购物车ch1-(安装依赖、简单配置、 axios获取api的模拟数据)

    0--项目说明 说明此项目源自某课网购物车教程,但是在开发过程中,发现在开发过程中用的还是 vue-resource(宣布不更新的类$.ajx()插件),为了以后的发展使用axios.js,详情参考 ...

  3. vue实战记录(五)- vue实现购物车功能之商品总金额计算和单选全选删除功能

    vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(五) GitHub:sue ...

  4. Flutter实战视频-移动电商-58.购物车_删除商品功能制作

    58.购物车_删除商品功能制作 主要做购物车后面的删除按钮 删除的方法写在provide里面 provide/cart.dart文件 传入goodsId,循环对比,找到后进行移除 //删除单个购物车商 ...

  5. ecshop删除商品函数

    /** * 从回收站删除多个商品 * @param mix $goods_id 商品id列表:可以逗号格开,也可以是数组 * @return void */ function delete_goods ...

  6. Vue小案例 之 商品管理------删除商品与提示

    实现删除商品功能 根据索引来进行删除商品: 实现删除商品的HTML: <!--显示表格--> <div class="table-warp"> <di ...

  7. 【SSH网上商城项目实战11】查询和删除商品功能的实现

    转自:https://blog.csdn.net/eson_15/article/details/51360804 在第8节我们完成了查询和删除商品类别的功能,那么现在实现查询和删除商品的功能就很好做 ...

  8. NopCommerce 3.4中商品详情页面单选框、复选框的美化

    先上图给大家看看效果,点这里打开网站(后期可能会找不到这个商品,现在再测试阶段) 现在你能看到的这个页面中,尺寸.文本描述是单选框(属性是我乱写的名字),上门安装是复选框.效果就看到这里,请君跳过图片 ...

  9. vue2购物车ch4-(筛选v-for 点击的那个设置样式 设为默认地址其他 联动 非循环的列表选中和非选中 删除当前选中的列表)

    1 address.html <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

随机推荐

  1. Selenium常规操作---基于python

    from selenium import webdriver 1. 打开浏览器 driver=webdriver.Firefox()  #火狐浏览器 driver=webdriver.Ie()  #打 ...

  2. positio:absolute与position:relative的区别

    absolute 能让元素 inline-block 化:例如一个div标签默认宽度是100%显示的,但是一旦被absolute属性缠上,则100%默认宽度就会变成自适应内部元素的宽度. float ...

  3. 03-TypeScript中的强类型

    在js中不能定义类型,而是根据赋值后,js运行时推断类型.在ts中支持强类型,强类型包括string.number(浮点型,不是整型).boolean.any(任意类型).Array<T> ...

  4. Cousera课程Learning How to Learn学习报告

    花了三天完成了Cousera上的Learning how to learn的课程,由于未完成批阅他人作业,所以分不是很高,但是老师讲的课程非常的好,值得一听: 课程的笔记: 我们的一生是一个不断接触和 ...

  5. 团队作业8——第二次项目冲刺(Beta阶段)Day5--5.23

    1.提供当天站立式会议照片一张 2.会议内容 讨论已完成的功能 对于界面,谈谈各自的看法 商定测试计划 用户需求进一步调研 3.工作安排 队员 今日任务 明日任务 贡献比 林燕 测试运行效果 根据测试 ...

  6. 201521123030 《Java程序设计》第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 public boo ...

  7. 201521123015 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过? ...

  8. 学号:201521123116 《java程序设计》第三周学习总结

    1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识组织起来.请使用纸笔或者下面的工具画出本周学习到的知识点. 书面作业 Q1:代码阅读 pu ...

  9. 201521123047 《Java学习笔记》第二周学习总结

    1. 本周学习总结 -知道并了解到浮点数的误差关系,懂得运java.math.BigDecimal来进行浮点数的精确计算 -对于"="与"=="的区分 -字符串 ...

  10. 201521123032 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...