vue实现仿淘宝结账页面实例代码


Posted in Javascript onNovember 08, 2017

虽然Vue最强大的是组件化开发,但是其实多页面开发也蛮适合的。下面小编给大家分享vue实现仿淘宝结账页面实例代码,具体内容大家参考下本文。

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

效果图:

vue实现仿淘宝结账页面实例代码

更新后的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)" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @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)" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @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)" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="update">修改</a>
    <a href="javascript:void(0)" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" 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实现仿淘宝结账页面实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
[对联广告] JS脚本类
Aug 27 Javascript
jquery 表单取值常用代码
Dec 22 Javascript
Javascript中判断变量是数组还是对象(array还是object)
Aug 14 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
Jan 02 Javascript
javascript删除字符串最后一个字符
Jan 14 Javascript
jquery实现的用户注册表单提示操作效果代码分享
Aug 28 Javascript
jQuery实现Flash效果上下翻动的中英文导航菜单代码
Sep 22 Javascript
JS 数字转换为大写金额的简单实例
Aug 04 Javascript
使用PBFunc在Powerbuilder中支付宝当面付款功能
Oct 01 Javascript
bootstrap警告框使用方法解析
Jan 13 Javascript
jquery实现企业定位式导航效果
Jan 01 jQuery
微信小程序实现倒计时补零功能
Jul 09 Javascript
vue-router路由与页面间导航实例解析
Nov 07 #Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
Nov 07 #Javascript
EasyUI实现下拉框多选功能
Nov 07 #Javascript
ES6中字符串string常用的新增方法小结
Nov 07 #Javascript
ES6中数组array新增方法实例总结
Nov 07 #Javascript
vue组件父子间通信详解(三)
Nov 07 #Javascript
浅谈ES6 模板字符串的具体使用方法
Nov 07 #Javascript
You might like
PHP下一个非常全面获取图象信息的函数
2008/11/20 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
PHP Opcache安装和配置方法介绍
2015/05/28 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
JS写的数字拼图小游戏代码[学习参考]
2008/10/29 Javascript
IE的有条件注释判定IE版本详解(附实例代码)
2012/01/04 Javascript
jquery对象和DOM对象的区别介绍
2013/08/09 Javascript
javascript仿php的print_r函数输出json数据
2013/09/13 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
JavaScript判断DIV内容是否为空的方法
2016/01/29 Javascript
微信小程序实战之运维小项目
2017/01/17 Javascript
AngularJS获取json数据的方法详解
2017/05/27 Javascript
JS实现自定义状态栏动画文字效果示例
2017/10/12 Javascript
使用 Javascript 实现浏览器推送提醒功能的示例
2017/11/03 Javascript
laravel5.3 vue 实现收藏夹功能实例详解
2018/01/21 Javascript
使用vue2.0创建的项目的步骤方法
2018/09/25 Javascript
element-ui upload组件多文件上传的示例代码
2018/10/17 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
2020/05/11 Javascript
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
Python中subprocess模块用法实例详解
2015/05/20 Python
Python输出汉字字库及将文字转换为图片的方法
2016/06/04 Python
python实现Decorator模式实例代码
2018/02/09 Python
Python 忽略warning的输出方法
2018/10/18 Python
numpy:找到指定元素的索引示例
2019/11/26 Python
Python Socketserver实现FTP文件上传下载代码实例
2020/03/27 Python
CSS3之多背景background使用示例
2013/10/18 HTML / CSS
CSS3 清除浮动的方法示例
2018/06/01 HTML / CSS
工作的心得体会
2013/12/31 职场文书
保安岗位职责
2014/02/21 职场文书
酒店开业庆典策划方案
2014/05/28 职场文书
2014年团员学习十八大思想汇报
2014/09/13 职场文书
房屋买卖协议样本
2014/11/16 职场文书
护士爱岗敬业心得体会
2016/01/25 职场文书
使用pycharm运行flask应用程序的详细教程
2021/06/07 Python