购物车升级训练

在上一版代码基础上,增加了模态框弹窗效果,新增点击删除,全部删除按钮,结算时显示模态框提示消息,增加分类已加入,未加入,全部,分类按钮,用到了$ref对DOM操作,0表示未导入,1表示已加入,all表示全部列表,这个功能代码示例如下:

页面部分用到了v-show v-if条件作逻辑判断,动态消息提示部分让我深刻体会到了Vue 基于数据驱动是这样的方便,对DOM操作时,开始考虑到用指令去实现,后来试了几次都没有找到合适的方式,最后找到了$ref去操作DOM.Vue还有一些比如路由,组件,后续会用到的知识现在还有待学习,希望能完成的尽善尽美。

shopping_cart.js

  1 //var newProduct = {name:‘‘,color:‘‘,price:0,amount:0,default_nums:1,add_nums:0,ischange:‘btn-danger‘};
  2 // 商品列表json
  3 var goodsTable = new Vue({
  4   el: ‘.content‘,
  5   data: {
  6     // 用于保存每件商品的对象
  7     goodItem: {},
  8       // 用于保存用户添加到购车的商品数组
  9       buyLists: [],
 10     //要删除的索引
 11     nowIndex: -100,
 12     //消息
 13     msg: "",
 14     //要从数组中移除的商品名
 15     nm: "",
 16     //是否结算
 17     suc: false,
 18     //isAdd: true,
 19       // 默认的商品列表
 20     goods: [
 21       {name:‘iphone 7 plus 手机‘,color:‘银色‘,price:100,amount:0,default_nums:1,add_nums:0},
 22         {name:‘华硕笔记本电脑‘,color:‘黑色‘,price:100,amount:0,default_nums:1,add_nums:0},
 23         {name:‘九阳电热水瓶5L‘,color:‘白色‘,price:100,amount:0,default_nums:1,add_nums:0}
 24     ],
 25     //用于增加新商品到列表
 26     newProduct: {name:‘‘,color:‘‘,price:0,amount:0,default_nums:1,add_nums:0,ischange:‘btn-danger‘},
 27   },
 28   computed: {
 29     count: function() {
 30       var num = 0;
 31       for(var i in this.goods){
 32           num += parseInt(this.goods[i].default_nums);
 33       }
 34       return num;
 35     },
 36     total: function() {
 37       var total = 0;
 38       for(var i in this.goods){
 39           total += parseInt(this.goods[i].price * this.goods[i].default_nums);
 40       }
 41       return total;
 42     },
 43     addShoppingNum: function() {
 44       var addShoppingNum = 0;
 45       for(var i in this.goods){
 46           addShoppingNum += this.goods[i].add_nums;
 47       }
 48       return addShoppingNum;
 49     },
 50     costPaid: function() {
 51         var costPaid = 0;
 52         for(var i in this.goods){
 53           costPaid += parseInt(this.goods[i].price * this.goods[i].add_nums);
 54       }
 55       return costPaid;
 56     }
 57   },
 58   methods: {
 59     reduce: function(good) {
 60       if (good.default_nums <= 1) return;
 61       good.default_nums --;
 62       //good.ischange = ‘btn-danger‘;
 63     },
 64     /*addNum: function(good) {
 65       good.default_nums += 1;
 66       //good.ischange = ‘btn-danger‘;
 67     },*/
 68     addProduct: function() {
 69       //var len = this.goods.length;
 70       //追加商品
 71       //this.goods.push(Object.assign({},this.goods[len-1]));//浅拷贝
 72       //this.goods.push(Object.assign({}, this.newProduct));//浅拷贝
 73       this.goods.push(JSON.parse(JSON.stringify(this.newProduct)));//深拷贝
 74     },
 75     removeProduct: function(index,nm) {
 76       //删除商品
 77       if(index == -2){
 78         this.goods = [];
 79         this.buyLists = [];
 80       }else{
 81         this.goods.splice(index,1);
 82         //删除buyLists中的商品
 83         for(var i=this.buyLists.length-1; i>=0; i--){
 84           if(this.buyLists[i].name == nm){
 85               this.buyLists.splice(i,1);
 86           }
 87         }
 88       }
 89     },
 90       addToCar(good) {
 91           if(good.add_nums == good.default_nums) return;
 92           good.add_nums = good.default_nums;
 93       //good.ischange = ‘btn-success‘;
 94       this.goodItem = {name: good.name, nums: good.add_nums};
 95       // 创建用户当前添加的商品对象
 96           // 开始向数组中提添加当前物品,这里存在3种情况
 97       // 1、用户未添加过该商品,则直接向数组中push
 98       // 2、用于已经添加了该商品、并且未做购买数量修改,则不向数组中添加
 99       // 3、用于已经添加了该商品、但是修改了购买数量,直接替换数组中的该商品对象
100       var index = this.buyLists.findIndex((value, index, arr) => {
101          return value.name === this.goodItem.name;
102       });
103       //Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
104       index === -1 ? this.buyLists.push(this.goodItem) : Object.assign(this.buyLists[index], this.goodItem);
105     },
106     balance() {
107       if(this.suc){
108
109           console.log(this.buyLists);
110           if(this.buyLists.length != 0){
111             this.msg = ‘结算成功!‘;
112             console.log("结算成功!");
113           }else{
114             this.msg = ‘购物车还没有加入商品,请先加入到购物车!‘;
115             console.log("购物车还没有加入商品,请先加入到购物车!");
116           }
117       }
118     },
119     showFunction(n) {//$ref 操作DOM
120       if(n == ‘0‘){
121         for(var i in this.goods){
122           if(this.goods[i].default_nums == this.goods[i].add_nums){
123               this.$refs.good[i].style.display = "none";
124           }else{
125             this.$refs.good[i].style.display = "";
126           }
127         }
128       }else if(n==‘all‘){
129         for(var i in this.goods){
130             this.$refs.good[i].style.display = "";
131           }
132       }else if(n == ‘1‘){
133         for(var i in this.goods){
134           if(this.goods[i].default_nums == this.goods[i].add_nums){
135               this.$refs.good[i].style.display = "";
136           }else{
137             this.$refs.good[i].style.display = "none";
138           }
139         }
140       }
141    }
142   },
143   updated(){//数据更新完成后
144       //this.$refs.good[0].style.display == "none";
145       console.log(this.$refs.good);
146       console.log(this.$el);
147   }
148 })

shopping_cart.html

  1 <!DOCTYPE html>
  2 <html lang="zh-en">
  3 <head>
  4     <title>添加购物车商品列表</title>
  5     <meta charset="utf-8" />
  6     <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css" />
  7     <style type="text/css">
  8         [v-cloak]{ /*防止页面闪烁*/
  9             display: none !important;
 10         }
 11         .content{
 12             width: 1000px;
 13             margin: 100px auto;
 14         }
 15         .sWidth{
 16             width:50px;
 17             height:20px;
 18         }
 19         .hide{
 20             display: none;
 21         }
 22     </style>
 23 </head>
 24 <body>
 25
 26     <div class="content">
 27         <!-- 商品列表 -->
 28         <table class="table table-bordered" id="goods-table" v-cloak>
 29             <thead>
 30                 <th>序号</th>
 31                 <th>商品名称</th>
 32                 <th>颜色</th>
 33                 <th>数量</th>
 34                 <th>单价</th>
 35                 <th>金额</th>
 36                 <th>操作</th>
 37             </thead>
 38             <tbody>
 39                 <tr v-for="(good, $index) in goods" ref="good">
 40                     <td>{{ $index+1 }}</td>
 41                     <td><input v-model.lazy="good.name"></td>
 42                     <td><input v-model.lazy="good.color" class="sWidth"></td>
 43                     <td>
 44                         <button v-on:click="reduce(good)">-</button>
 45                         <input type="text" type="number"  v-model.number="good.default_nums"/>
 46                         <button v-on:click="good.default_nums += 1">+</button>
 47                     </td>
 48                     <td>
 49                         <input class="sWidth" v-model.number="good.price"></span>
 50                     </td>
 51                     <td>
 52                         <span>{{good.price*good.default_nums}}</span>
 53                     </td>
 54                     <td>
 55                         <button class="btn btn-sm" v-bind:class="good.default_nums == good.add_nums ? ‘btn-success‘ : ‘btn-danger‘" v-on:click="addToCar(good)">加入购物车</button>
 56                         <span>已加入购物车的该商品数量:</span>
 57                         <span>{{good.add_nums}}</span>
 58                         <button class="btn btn-sm btn-danger" data-toggle="modal" data-target="#layer" v-on:click="nowIndex=$index,msg=‘确认删除吗?‘,nm=good.name">删除</button>
 59                     </td>
 60                 </tr>
 61             </tbody>
 62             <tfoot>
 63                 <tr>
 64                     <td colspan="7">
 65                         <button class="btn btn-danger" v-on:click="addProduct()">添加商品</button>
 66
 67                         <button class="btn btn-sm btn-danger pull-right" data-toggle="modal" data-target="#layer" v-on:click="nowIndex=-2,msg=‘确认全部删除吗?‘">全部删除</button>
 68                     </td>
 69
 70                 </tr>
 71                 <tr>
 72                     <td colspan="6">
 73                         <span class="modal-title">{{msg}}</span>
 74                         <span v-show="msg==‘‘">合计数量{{count}}件</span>
 75                         <span v-show="msg==‘‘">合计金额{{total}}元</span>
 76                         <b v-show="msg!=‘已加入‘ && msg!=‘未加入‘ && msg!=‘结算成功!‘">||</b>
 77                         <span v-show="msg==‘未加入‘">购物车{{count - addShoppingNum}}件</span>
 78                         <span v-show="msg!=‘未加入‘">购物车{{addShoppingNum}}件</span>
 79                         <span v-show="msg!=‘未加入‘">花费{{costPaid}}元</span>
 80                     </td>
 81                     <td colspan="1">
 82                         <button class="btn btn-danger pull-left" v-on:click="msg=‘‘,showFunction(‘all‘)">全部</button>
 83                         <button class="btn btn-danger pull-left" v-on:click="msg=‘已加入‘,showFunction(‘1‘)">已加入</button>
 84                         <button class="btn btn-danger pull-left" v-on:click="msg=‘未加入‘,showFunction(‘0‘)">未加入</button>
 85                         <button class="btn btn-danger pull-right" data-toggle="modal" data-target="#layer" v-on:click="suc=true,msg=‘是否结算?‘">结算</button>
 86                     </td>
 87                 </tr>
 88             </tfoot>
 89         </table>
 90
 91         <!--模态框 弹出框-->
 92         <div role="dialog" class="modal fade bs-example-modal-sm" id="layer">
 93             <div class="modal-dialog">
 94                 <div class="modal-content">
 95                     <div class="modal-header">
 96                         <button type="button" class="close" data-dismiss="modal">
 97                             <span>&times;</span>
 98                         </button>
 99                         <h4 class="modal-title">{{msg}}</h4>
100                     </div>
101                     <div class="modal-body text-right">
102                         <button data-dismiss="modal" class="btn btn-default btn-sm" v-on:click="suc=false,msg=‘‘">取消</button>
103                         <button data-dismiss="modal" class="btn btn-danger btn-sm" v-on:click="removeProduct(nowIndex,nm),msg=‘‘" v-if="!suc">确认</button>
104                         <button data-dismiss="modal" class="btn btn-danger btn-sm" v-on:click="balance()" v-else>结算</button>
105                     </div>
106                 </div>
107             </div>
108         </div>
109
110     </div>
111     <!-- js -->
112     <script type="text/javascript" src="js/vue.js"></script>
113     <script type="text/javascript" src="js/shopping_cart.js"></script>
114     <script src="js/jquery-1.8.1.min.js"></script>
115     <script src="js/bootstrap.js"></script>
116 </body>
117 </html>

效果图如下:

删除效果

 

全部删除

已加入购物车

未加入购物车
 

结算提示
 

结算成功提示
 

最后,欢迎大家对我做的这个小练习,批评指正,共同进步。

git>https://github.com/double2018/shopping_cart/

原文地址:https://www.cnblogs.com/double405/p/8312685.html

时间: 2024-08-30 00:46:42

购物车升级训练的相关文章

python之购物车升级1

python之购物车升级1 源码: li = [{'name':'西瓜','price':30},{'name':'苹果','price':10},{'name':'香蕉','price':20}] print('欢迎光临') shopping_car = {} my_money = input('请输入你当前的资金:') if my_money.isdigit() and int(my_money) >0: for i,k in enumerate(li): print('序号{},商品{},

【转】Ninject的使用

转自: http://www.cnblogs.com/willick/p/3223042.html(整个系列的文章都不错,知识点全面,值得新手学习) 为什么需要依赖注入 在[ASP.NET MVC 小牛之路]系列的理解MVC模式文章中,我们提到MVC的一个重要特征是关注点分离(separation of concerns).我们希望应用程序的各部分组件尽可能多的相互独立.尽可能少的相互依赖. 我们的理想情况是:一个组件可以不知道也可以不关心其他的组件,但通过提供的公开接口却可以实现其他组件的功能

localStorage购物车(升级一下)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>购物车</title> <style type="text/css" media="screen"> th,td{ border:1px solid #ccc; padding:0 50px; height

周末训练 ——购物车&amp;BMI指数系统

一.购物车 功能要求:要求用户输入自己拥有总资产,例如:2000显示商品列表,让用户根据序号选择商品,加入购物车购买,如果商品总额大于总资产,提示账户余额不足,否则,购买成功.goods = [    {"name": "电脑", "price": 1999},    {"name": "鼠标", "price": 10},    {"name": "游艇&

算法训练:身份证号码升级

问题描述 从1999年10月1日开始,公民身份证号码由15位数字增至18位.(18位身份证号码简介).升级方法为: 1.把15位身份证号码中的年份由2位(7,8位)改为四位. 2.最后添加一位验证码.验证码的计算方案: 将前 17 位分别乘以对应系数 (7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2) 并相加,然后除以 11 取余数,0-10 分别对应 1 0 x 9 8 7 6 5 4 3 2. 请编写一个程序,用户输入15位身份证号码,程序生成18位身份证号码.假设所

美丽联合业务升级下的机器学习应用

通常机器学习在电商领域有三大应用,推荐.搜索.广告,这次我们聊聊三个领域里都会涉及到的商品排序问题.从业务角度,一般是在一个召回的商品集合里,通过对商品排序,追求GMV或者点击量最大化.进一步讲,就是基于一个目标,如何让流量的利用效率最高.很自然的,如果我们可以准确预估每个商品的GMV转化率或者点击率,就可以最大化利用流量,从而收益最大. 蘑菇街是一个年轻女性垂直电商平台,主要从事服饰鞋包类目,2015年时全年GMV超过了百亿,后与美丽说合并后公司更名为美丽联合集团.2014年时入职蘑菇街,那时

深度残差网(deep residual networks)的训练过程

这里介绍一种深度残差网(deep residual networks)的训练过程: 1.通过下面的地址下载基于python的训练代码: https://github.com/dnlcrl/deep-residual-networks-pyfunt 2.这些训练代码需要和pydataset包.下面介绍这两个包的安装方法. (1)pyfunt需要安装. 用命令:pip install git+git://github.com/dnlcrl/PyFunt.git  进行下载安计.        安装时

使用docker安装部署Spark集群来训练CNN(含Python实例)

使用docker安装部署Spark集群来训练CNN(含Python实例) 本博客仅为作者记录笔记之用,不免有很多细节不对之处. 还望各位看官能够见谅,欢迎批评指正. 博客虽水,然亦博主之苦劳也. 如需转载,请附上本文链接,不甚感激! http://blog.csdn.net/cyh_24/article/details/49683221 实验室有4台神服务器,每台有8个tesla-GPU,然而平时做实验都只使用了其中的一个GPU,实在暴遣天物! 于是想用spark来把这些GPU都利用起来.听闻d

跨园区容灾,升级不停服——高可用负载均衡集群实践

对于云计算行业来说,云服务的可用性和可扩展性是的检测其服务质量的重要标准,也是最受用户关注的两大难题.各云计算厂商针对容灾.升级等需求的解决方案,最能够体现其底层架构的实力.腾讯云基于基础架构的优势,为分期乐.微信红包等平台提供技术支持,可以完美满足如下三点需求: 1. 高可用能力,容灾能力强,升级不停服 2. 可扩展性强,功能丰富,性能超高 3. 避免重复造轮子,性价比之王 近期,针对一些客户对腾讯云产品可用性的问询,腾讯云基础产品团队对负载均衡产品的原理做出详细阐述,并希望通过对腾讯负载均衡