vue实现仿淘宝结账页面
这个demo,是小颖基于之前的 vue2.0在table中实现全选和反选 文章进行更新后的demo,主要功能呢,是仿照淘宝页面的结算购物车商品时自动算出合计价格的页面,具体页面效果请看下面的动图:(如果大家发现有什么问题请及时提出帮小颖改正错误呦,谢谢啦嘻嘻)
效果图:

更新后的home.vue
<template>
<div class="container">
<div class="checkout-title">
<span>购物车</span>
</div>
<table class="product_table">
<tbody>
<template v-for="(list,index) in table_list">
<tr>
<td width="7%" min-width="94px" v-if="index===0">
<input type="checkbox" v-model='checked' @click='checkedAll'>
</td>
<td width="7%" v-if="index!==0">
<input type="checkbox" v-model='checkList' :value="list.id" @click=checkProductFun(index,$event)>
</td>
<td width="43%">{{list.product_inf}}</td>
<td width="10%" v-if="index===0">{{list.product_price}}</td>
<td width="10%" v-if="index!==0">¥{{list.product_price}}</td>
<td width="10%" v-if="index===0">{{list.product_quantity}}</td>
<td width="10%" v-if="index!==0">
<a class="numbers plus" href="javascript:void(0)" @click="changeMoney(index,-1)">-</a>
<input class="txt_number" type="text" v-model="list.product_quantity" size="1" disabled>
<a class="numbers reduce" href="javascript:void(0)" @click="changeMoney(index,1)">+</a>
</td>
<td width="10%">{{list.total_amount}}</td>
<td width="20%" v-if="index===0">编辑</td>
<td width="20%" v-if="index!==0">
<a href="javascript:void(0)" class="update">修改</a>
<a href="javascript:void(0)" class="delete">删除</a>
</td>
</tr>
</template>
</tbody>
</table>
<div class="price_total_bottom">
<div class="price_total_ms">
<label>合计:{{allProductTotal}}</label>
<router-link to="/userAddress">结账</router-link>
</div>
</div>
</div>
</template>
<script>
import userAddress from './address'
export default {
components: {
userAddress
},
data() {
return {
table_list: [{
'id': 0,
'product_inf': '商品信息',
'product_price': '商品金额',
'product_quantity': '商品数量',
'total_amount': '总金额'
}, {
'id': '1',
'product_inf': '女士银手链',
'product_price': 100,
'product_quantity': 10,
'total_amount': 1000
}, {
'id': '2',
'product_inf': '女士银手镯',
'product_price': 200,
'product_quantity': 5,
'total_amount': 1000
}, {
'id': '3',
'product_inf': '女士银耳环',
'product_price': 50,
'product_quantity': 10,
'total_amount': 500
}],
checked: false,
allProductTotal: null,
checkList: ['1', '3']
}
},
mounted: function() {
var _this = this;
// 根据data中默认勾选的checkbox,计算当前勾选的商品总价
_this.allProductTotal = 0;
this.checkList.forEach(function(element1, index1) {
_this.table_list.forEach(function(element2, index2) {
if (element1 == element2.id) {
_this.$set(_this.table_list[index2], 'checked', true);
_this.allProductTotal += element2.product_price * element2.product_quantity;
}
});
});
},
methods: {
checkedAll: function() {
var _this = this;
_this.allProductTotal = 0;
if (_this.checked) { //实现反选
_this.checkList = [];
_this.table_list.forEach(function(item, index) {
if (_this.table_list[index].checked) {
_this.table_list[index].checked = false;
}
});
} else { //实现全选
_this.checkList = [];
_this.table_list.forEach(function(item, index) {
if (index > 0) {
_this.checkList.push(item.id);
if (!_this.table_list[index].checked) {
_this.$set(_this.table_list[index], 'checked', true);
} else {
_this.table_list[index].checked = true;
}
if (item.checked) {
_this.allProductTotal += item.product_price * item.product_quantity;
}
}
});
}
},
checkProductFun(index, event) { //根据checkbox是否勾选,计算勾选后的商品总价
var _this = this;
_this.allProductTotal = 0;
if (event.target.checked) {
if (!_this.table_list[index].checked) {
_this.$set(_this.table_list[index], 'checked', true);
}
} else {
if (_this.table_list[index].checked) {
_this.table_list[index].checked = false;
}
}
this.table_list.forEach(function(item, index) {
if (item.checked) {
_this.allProductTotal += item.product_price * item.product_quantity;
}
});
},
changeMoney: function(index, way) {
if (way > 0) {
this.table_list[index].product_quantity++;
} else {
this.table_list[index].product_quantity--;
if (this.table_list[index].product_quantity < 1) {
this.table_list[index].product_quantity = 1;
}
}
this.calcTotalPrice();
},
calcTotalPrice: function() {
var _this = this;
_this.allProductTotal = 0;
this.table_list.forEach(function(item, index) {
if (index > 0) { //因为第一行为表头不需要进行计算
item.total_amount = item.product_price * item.product_quantity; //根据商品数量计算每一个商品对应的总金额
}
if (item.checked) {
_this.allProductTotal += item.product_price * item.product_quantity; //根据是否否选该商品的checkbox,计算总价
}
});
},
},
watch: { //深度 watcher
'checkList': {
handler: function(val, oldVal) {
if (val.length === this.table_list.length - 1) {
this.checked = true;
} else {
this.checked = false;
}
},
deep: true
}
}
} </script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.container {
padding: 69px 0 54px 0;
} table {
border-collapse: collapse;
border-color: transparent;
text-align: center;
} .product_table,
.product_table tbody {
width: 100%
} .product_table tr:first-child {
background: #ece6e6;
color: #e66280;
font-size: 20px;
} .product_table td {
border: 1px solid #f3e8e8;
height: 62px;
line-height: 62px;
} .product_table a.update:link,
.product_table a.update:visited,
.product_table a.update:hover,
.product_table a.update:active {
color: #1CE24A;
} .product_table a.delete:link,
.product_table a.delete:visited,
.product_table a.delete:hover,
.product_table a.delete:active {
color: #ffa700;
} .product_table .txt_number {
text-align: center;
} .product_table .numbers {
font-weight: bold;
} .price_total_bottom {
font-size: 20px;
padding: 20px 10px;
} .price_total_ms {
text-align: right;
} .price_total_bottom .price_total_ms label {
margin-right: 100px;
} .price_total_bottom .price_total_ms a {
cursor: default;
text-align: center;
display: inline-block;
font-size: 20px;
color: #fff;
font-weight: bold;
width: 220px;
height: 54px;
line-height: 54px;
border: 0;
background-color: #f71455;
} </style>
vue实现仿淘宝结账页面的更多相关文章
- Vue实现仿淘宝商品详情属性选择的功能
Vue实现仿淘宝商品详情属性选择的功能 先看下效果图:(同个属性内部单选,属性与属性之间可以多选) 主要实现过程: 所使用到的数据类型是(一个大数组里面嵌套了另一个数组)具体格式如下: attrA ...
- vue仿淘宝结账订单
<template> <div class="container"> <div class="checkout-title"& ...
- swiper 仿淘宝详情页面 视频图片切换
1.好兄弟,看一下是否是你需要的 2.废话不多说 直接上代码,复制粘贴一下 自己引用一下swiper.js和css 然后就可以开始玩儿了 <!DOCTYPE html> <html& ...
- jquery仿淘宝购物车页面商品结算(附源码)
1.效果图如下: 2.源码如下: html部分: <!doctype html> <html lang="en"> <head> <met ...
- 转::iOS 仿淘宝,上拉进入详情页面
今天做的主要是一个模仿淘宝,上拉进入商品详情的功能,主要是通过 tableView 与 webView 一起来实现的,当然也可根据自己的需要把 webView 替换成你想要的 // // ViewCo ...
- 基于Bootstrap仿淘宝分页控件实现
.header { cursor: pointer } p { margin: 3px 6px } th { background: lightblue; width: 20% } table { t ...
- Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片
Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片 自定义ADPager 自定义水平滚动的ScrollView效仿ViewPager 当遇到要在Vie ...
- JS仿淘宝详情页菜单条智能定位效果
类似于淘宝详情页菜单条智能定位 对于每个人来说并不陌生!如下截图所示:红色框的那部分! 基本原理: 是用JS侦听滚动事件,当页面的滚动距离(页面滚动的高度)大于或者等于 "对象"( ...
- 淘宝购物车页面 智能搜索框Ajax异步加载数据
如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区 ...
随机推荐
- EXIT_SUCCESS EXIT_FAILURE
在vc++6.0下头文件stdlib.h中定义如下: /* Definition of the argument values for the exit() function */ #define E ...
- 实例讲解webpack的基本使用第一篇
更新文章不容易,尤其是更新高质量的文章更加不易,因此为了节约时间,闲话就不多说了.关于webpack的介绍,webpack是用来干嘛的,这些基础概念性的东西,就不在此赘述,下面直接开始正题. webp ...
- POJ1083 Moving Tables(模拟)
The famous ACM (Advanced Computer Maker) Company has rented a floor of a building whose shape is in ...
- Angular JS中的路由
前 言 本章节将为大家介绍 AngularJS 路由.AngularJS 路由允许我们通过不同的 URL 访问不同的内容.通过 AngularJS 可以实现多视图的单页We ...
- C#实现基于ffmepg加虹软的人脸识别
关于人脸识别 目前的人脸识别已经相对成熟,有各种收费免费的商业方案和开源方案,其中OpenCV很早就支持了人脸识别,在我选择人脸识别开发库时,也横向对比了三种库,包括在线识别的百度.开源的OpenCV ...
- STM8学习 无法仿真原因Starting debug session... -> Emulator reset (usb://usb)... ** Connection error (usb://usb): swim error [30200]: st-link connection error
刚调试程序时,STlink总是连不上,一直提示: Starting debug session...-> Emulator reset (usb://usb)...** Connection e ...
- Python系列之文件操作、冒泡算法、装饰器、及递归
文件处理 python对文件进行读写操作的方法与具体步骤,包括打开文件.读取内容.写入文件.文件中的内容定位.及关闭文件释放资源等 open().file(),这个两函数提供了初始化输入\输出(I\O ...
- PS+HTML测试
PS: 1. 写出标尺.参考线.网格线.放大和缩小的快捷键 2. 写出RGB模式和CMYK颜色模式里每一个字母代表什么颜色 3. 写出暖色和冷色各3种 4. 写出常用的抠图工具(6个以上) 5. 写出 ...
- Sql语句构造类,多字段新增或修改时,拼装sql语句比较方便
using System; using System.Collections.Generic; using System.Text; namespace MSCL { #region 使用示例 /* ...
- python contextlib 上下文管理器
1.with操作符 在python中读写文件,可能需要这样的代码 try-finally读写文件 file_text = None try: file_text = open('./text', 'r ...