小程序购物车

shopcart.gif

本来想做搬运工的, 网上找了一些案列, 找了三个小时都没有找到自己想要的, 或者有很多BUG, 一气之下就自己写了. 有不对的地方望提出更正~~
正文:
1 初始数据

/**
  * 页面的初始数据
*/
  data: {
    adminShow: true,//编辑或完成      
    totalPrice: 0,//总金额 
    allselect:false,//是否全选    
    selectArr: [], //已选择的商品  
    cartData:[
      {
        "id":1,
        "amount":2,
        "price":50,
        "name":"手机",
        "checked":false,
        "image":"https://images.unsplash.com/photo-1551214012-84f95e060dee?w=640"
      },
      {
        "id":2,
        "amount":1,
        "price":10,
        "name":"显示器",
        "checked": false,
        "image":"https://images.unsplash.com/photo-1551214012-84f95e060dee?w=640"
      },
      {
        "id":3,
        "amount":5,
        "price":120,
        "name":"可乐",
        "checked": false,
        "image":"https://images.unsplash.com/photo-1551214012-84f95e060dee?w=640"
      },
      {
        "id":4,
        "amount":10,
        "price":50,
        "name":"手机",
        "checked": false,
        "image":"https://images.unsplash.com/photo-1551214012-84f95e060dee?w=640"
      },
      {
        "id":4,
        "amount":1,
        "price":10,
        "name":"芝麻",
        "checked": false,
        "image":"https://images.unsplash.com/photo-1551214012-84f95e060dee?w=640"
      },
    ],
    
  },

2 wxml(类名不会取 , 请勿吐槽, 大部分都是从网上找的案例复制过来的类名 , 都没改动) :

<view class="cart_body">
  <view class="cart_item">
    <label wx:for="{{cartData}}" wx:key="this"  data-index="{{index}}" catchtap="checkTap">
      <!-- 选中的按钮,  就两张图片 -->
       <view class="check_box">
           <image class="check_img" hidden="{{item.checked}}" src="/images/icon_yn@2x.png"></image>
           <image class="check_img" hidden="{{!item.checked}}" src="/images/iocn_ys@2x.png"></image>
      </view>

      <view class="cart_image">
           <image class="cart_img" src="{{item.image}}"  mode='aspectFill'></image>
      </view>
       
       <view class="cart_content">
           <view class="content_title fs_12 fc_333">{{item.name}}</view>
           <view class="content_price">
                <view class="fc_price fs_18 fw_bold">¥{{item.price}}</view>
                <view class="goods_number_container">
                  <view class="goods_number_icon_container">
                    <image 
                      class="goods_number_icon" 
                      src="/images/btn_reduce@2x.png"
                      data-types="minus"
                      data-index="{{index}}" 
                      catchtap="numchangeTap"></image>
                  </view>
                  <view class="goods_number">{{item.amount}}</view>
                  <view class="goods_number_icon_container">
                    <image 
                      class="goods_number_icon" 
                      src="/images/btn_plus@2x.png"
                      data-types="add"
                      data-index="{{index}}"
                      catchtap="numchangeTap"></image>
                  </view>
              </view>
          </view>
      </view>
    </label>
  </view>
</view>
<!-- 全选 计算价格 编辑 结算 -->
<view class="cart_total_container">
      <image class="checkAllBox" src="/images/icon_yn@2x.png" hidden="{{allselect}}" catchtap="allcheckTap"></image>
      <image class="checkAllBox" src="/images/iocn_ys@2x.png" hidden="{{!allselect}}" catchtap="allcheckTap"></image>
      <view class="fs_12 fc_333" catchtap="allcheckTap">全选</view>
      <view class="fc_333 fs_12 totalPrice">合计:¥ {{totalPrice}}</view>
      <view class="clearingBox" wx:if="{{adminShow}}">
        <view class="btn editbtn fs_12 fc_666" catchtap='adminTap'>编辑</view>
        <view class="btn clearbtn fs_12" bindtap="toApply">去结算({{selectArr.length}})</view>
      </view>
      <view class="clearingBox" wx:else>
        <view class="btn editbtn fs_12 fc_666" catchtap="deleteshopTap">删除</view>
        <view class="btn clearbtn fs_12" catchtap='adminTap'>完成</view>
      </view>
  </view>

3, 我的业务逻辑:
1, 选中单个商品, 放到已选择的商品数组, 计算价格, 判断是否全选
2, 取消单个商品, 从已选择的商品数组中移除, 计算价格
3, 点击全选, 所有数据都放到已选择商品数组里, 计算价格
4,取消全选, 已选择商品数据清空, 价格清空
5,删除商品, 清空已选择商品的数组, 删除对应的初始数据, 价格清空
6, 数量加减, 未选择的商品数量加减不计算价格, 只改变初始数据, 选中的商品数量加减计算价格,改变初始数据

总结有这么几个功能: 单个商品选择、全选、判断是否全选、删除、数量加减、计算价格、编辑或完成显示的按钮、结算

//计算价格
calculateTotal:function(){
    var selectArr = this.data.selectArr;   //已选择的商品
    var totalPrice = 0;
    if(selectArr.length){  //如果存在商品就计算价格
      for(var i=0;i<selectArr.length;i++){
        totalPrice += selectArr[i].amount * selectArr[i].price;
      }
      totalPrice = totalPrice.toFixed(2);  //乘法有点问题, 需要保留一下小数
      console.log("计算价格:",totalPrice)
      this.setData({
        totalPrice:totalPrice
      })
    } else{  //不存在商品就把总价格置为 0
      this.setData({
        totalPrice:0
      })
    }
  },
//判断是否为全选  
  judgmentAll: function () {
    var cartData = this.data.cartData;  //初始数据
    var selectArr = this.data.selectArr;  //已选择的商品
    if(selectArr.length == cartData.length){  //长度相等就是全部选上了
      this.setData({
        allselect: true
      })
    } else {
      this.setData({
        allselect: false
      })
    }
  },
//全选
  allcheckTap:function(){
    var that = this;
    var cartData = that.data.cartData;  //初始数据
    var selectArr = [];  //定义空数组
    var allselect = !that.data.allselect; //data里的是否全选先改变状态存着
    
    if(allselect){ //如果为真, 初始数据里的每条checked变为true, 然后push到定义的空数组里
      for (var i = 0; i < cartData.length; i++) {
        cartData[i].checked = true;
        selectArr.push(cartData[i])
      }
    }else{ //不为真就变成false, 定义的数组再置空一次
      for (var i = 0; i < cartData.length; i++) {
        cartData[i].checked = false;
      }
      selectArr = [];
    }
    that.setData({   //重新设置数据
      cartData: cartData,  //初始的数据
      allselect: allselect,  //全选的状态
      selectArr: selectArr  //已选择的商品
    })
    that.calculateTotal();  // 最后计算一次价格 (计算价格放到重置数据之前会出问题)
  },
//单个商品选择
  checkTap:function(e){
    var index = e.currentTarget.dataset.index; //取到渲染的下标
    var cartData = this.data.cartData;  //初始数据
    var selectArr = this.data.selectArr; //已选择的商品数组
    cartData[index].checked = !cartData[index].checked //没选中的就要选中, 选中了的就取消选中状态
    if (cartData[index].checked){ //如果选中了, 就放到一选择的商品数组里
      for (var i = 0; i < cartData.length; i++) {
        if (cartData[i] == cartData[index]) {
          selectArr.push(cartData[index])
        }
      }
      this.judgmentAll();  //计算价格
    } else{  //取消选中就从已选择的商品数组里移除
      for (var i = 0; i < selectArr.length; i++) {
        if(selectArr[i].id == cartData[index].id){
          selectArr.splice(i,1)
        }
      }
      this.judgmentAll(); //选择的时候要判断是不是已经选择了全部的
    }
    this.calculateTotal(); //计算一次价格
    
    console.log("已选择的商品:",selectArr)
    this.setData({  //重置数据
      cartData:cartData, 
      selectArr: selectArr
    })
  },
//数量加减
  numchangeTap:function(e){
    var types = e.currentTarget.dataset.types;   //加和减的两张图片上分别设置了types属性
    var index = e.currentTarget.dataset.index;  //获取下标
    var cartData = this.data.cartData;  //初始数据
    if (types == 'minus') {  //减
      var amount = cartData[index].amount;
      if(amount <= 1){  //不允许商品数量小于1 ,  都添加到购物车了还要减到0是几个意思? 反正有个删除按钮
        return;
      } else {
        cartData[index].amount--;
        this.setData({
          cartData: cartData
        })
        this.calculateTotal();  //计算价格
      }
    }
    if (types == "add") {  //加
      cartData[index].amount++;   //加就不判断了, 加到二十二世纪去都行
      this.setData({
        cartData: cartData
      })
      this.calculateTotal();  //计算价格
    }
  },
//删除商品 
  deleteshopTap:function(){  //要删除 肯定是已经选中了的商品, 所以肯定在 selectArr里面
    //这里好像有一点小BUG, 不过, 我忘记了.  
    var cartData = this.data.cartData;   //初始数据
    var selectArr = this.data.selectArr;  //已选择的商品数组
    if(selectArr.length){  //如果以选择的商品数组里有长度
      for (var i = 0; i < cartData.length; i++) {
        for (var j = 0; j < selectArr.length; j++) {
          if (cartData[i].id == selectArr[j].id) {    //把初始数据的对应id的数据删掉就好了
            cartData.splice(i, 1);
          }
        }
      }
      this.setData({  //重置一下数据
        cartData: cartData,
        selectArr: []   //已选择的数组置空
      })
      this.calculateTotal();  //计算价格
    }
  },
//编辑或完成
  adminTap:function(){  //切换四个按钮的显示
    this.setData({
      adminShow: !this.data.adminShow
    })
  },
//结算
  toApply:function(){
    console.log("已选择的商品:",this.data.selectArr)
  },

从接口获取到的数据自己改成那种格式就可以了.

// wxss
.cart_body{
  box-sizing: border-box;
  padding: 0 32rpx;
}
.cart_item{
  box-sizing: border-box;
  padding-bottom: 100rpx;
}
.check_img{
  width: 40rpx;
  height: 40rpx;
  margin-top: 76rpx;
}

label{
  display: flex;
  padding: 46rpx 0;
}
.cart_image{
  width: 192rpx;
  height: 192rpx;
  margin-left: 32rpx;
}
.cart_img{
  width: 100%;
  height: 100%;
  border-radius: 8rpx;

}
.cart_content{
  margin-left: 20rpx;
  flex:1;
  display: flex;
  flex-flow: column wrap;
  justify-content: space-between;
}
.content_title{
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp:2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
}

.content_price{
  display: flex;
  justify-content: space-between;
}
.goods_number_container{
  width: 170rpx;
  display: flex;
  justify-content: space-between;
}
.goods_number_icon_container{
  width: 44rpx;
  height:44rpx;
}
.goods_number_icon{
  width:100%;
  height:100%;
}
.goods_number{
  flex:1;
  text-align: center;
}
.cart_total_container{
  height: 100rpx;
  line-height: 88rpx;
  background: #f5f5f5;
  position: fixed;
  bottom:0;
  left:0;
  right:0;
  box-sizing: border-box;
  padding: 12rpx 32rpx;
  display: flex;
}
.checkAllBox{
  border-radius: 50%;
  height: 40rpx;
  width: 40rpx;
  margin-top: 23rpx;
  margin-right: 8rpx;
}
.totalPrice{
  flex:1;
  margin-left: 40rpx;
}
.clearingBox{
  width: 300rpx;
  display: flex;
  justify-content: space-between;
}
.btn{
  width: 140rpx;
  text-align: center;
  border-radius: 36rpx;
  line-height: 72rpx;
}
.editbtn{
  border: 1px solid #666666;
  background: #fff;
}
.clearbtn{
  background: #ff5c4d;
  color: #fff;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容