小程序购物车多商家 &数量加减 总价

最近做了个商城小程序,整理了一下,直接复制到小程序页面运行就行。数据是本地根据自己的需要更改。

<view class='cartallview'>

<view class="cart-box" wx:for="{{cartsdata}}" wx:key="{{index}}" wx:for-index="idx">

  <!-- wx:for 购物车信息列表 头部商家名称 -->

  <view class='storehed'>

    <icon  type="{{item.selected ? 'success':'circle'}}" bindtap="storeselected" data-index="{{idx}}" />

    <text>{{item.storename}}</text>

  </view>

  <!-- goodslist -->

  <view>

    <!-- 商品组键 -->

    <view class='shopgoodlist' wx:for="{{item.goodsinfo}}"  wx:key="{{index}}">

      <!-- wx:if 是否选择显示不同图标 -->

      <icon type="{{item.selected ? 'success':'circle'}}" bindtap="goodsselected" data-index="{{index}}" data-select-index="{{idx}}" />

      <!-- 点击商品图片可跳转到商品详情 -->

      <image class="cart-thumb" src="https://yin.xiaweicun.com/uploads/admin/article_thumb/20180927/c3f8e6f2b0db8a1bbf33d91dd99b976b.png"></image>

      <view class='goodsdata'>

        <text class='goodsname'>{{item.goodsname}}</text>

        <text class='specification'>{{item.specification}}</text>

        <text class='price'>价格¥{{item.price}}</text>

        <!-- 增加减少数量按钮 -->

        <view class='goodsnum'>

          <text bindtap="minusCount" data-index="{{index}}" data-select-index="{{idx}}" bindtap='minusCount'>-</text>

          <text>{{item.num}}</text>

          <text bindtap="addCount" data-index="{{index}}" data-select-index="{{idx}}" bindtap='addCount'>+</text>

        </view>

      </view>

    </view>

</view>

</view>

</view>

<!-- 合计 提交订单 -->

<view  class='allselected'>

<view>

<icon  type="{{allselected ? 'success':'circle'}}" bindtap="tapallallprices" />

<text>已选({{allnum}})</text>

</view>

<view>

<text class='allprices'>¥{{allprices}}</text>

<text class='placeanorder'>下单</text>

</view>

</view>

------------------------------分割线--------------------------------------


.cartallview{

  padding-bottom: 166rpx;

}

.storehed{

  display: flex;

  align-items: center;

  height: 80rpx;

  font-size: 30rpx;

  border-top:1rpx solid #f5f5f5; 

  border-bottom:1rpx solid #f5f5f5; 

}

/* 单页全局 */

icon{

  margin-left: 20rpx;

}

text{

  margin-left: 20rpx;

}

.shopgoodlist{

  display: flex;

  justify-content: flex-start;

  font-size: 28rpx;

  height: 230rpx;

  padding-top: 20rpx;

  border-top:1rpx solid #f5f5f5; 

  border-bottom:1rpx solid #f5f5f5; 

  position: relative;

}

.shopgoodlist image{

  margin:0 20rpx;

  height: 120rpx;

  width: 120rpx;

}

.shopgoodlist .goodsdata text{

  display: block;

}

.shopgoodlist .goodsdata .goodsname{

  height: 70rpx;

}

.shopgoodlist .goodsdata .specification{

font-size: 25rpx;

color: #b2b2b2;

}

.shopgoodlist .goodsdata .price{

  margin-top: 5rpx;

  font-size: 29rpx;

  color: #f10000;

}

.shopgoodlist .goodsdata .goodsnum {

  position: absolute;

  right: 30rpx;

  bottom: 20rpx;

}

.shopgoodlist .goodsdata .goodsnum text{

  margin-left: 0;

  display: inline-block;

  border: 1rpx solid #f5f5f5;

  width: 90rpx;

  height: 53rpx;

  line-height: 53rpx;

  text-align: center;

}

/* 合计 */

.allselected{

  margin-left:0;

  width: 100%;

  background: #fafafa;

  height: 100rpx;

  display: flex;

  position: fixed;

  align-items:center;

  justify-content:space-between;

  bottom: 0;

}

.allselected view{

  display: flex;

  flex: 1;

  align-items:center;

  font-size: 30rpx;

}

.allselected view .allprices{

  flex: 1;

  margin:0;

  color: #ec5151;

}

.allselected view .placeanorder{

  margin:0;

  flex: 1;

  background-color: #ec5151;

  text-align: center;

  height: 100rpx;

  line-height: 100rpx;

  color: #ffffff;

}

---------------------分割线---------------------------------

// pages/shopping/shopping.js

Page({

  /**

  * 页面的初始数据

  */

  data: {

    allselected: false,

    allnum: 0,

    allprices: 0,

    cartsdata: [{

      storename: '测试商家1',

      selected: false,

      goodsinfo: [{

        goodsname: '商铺1的产品1',

        specification: '规格',

        price: '100.22',

        num: '1',

        selected: false

      }, {

        goodsname: '商铺1的产品2',

        specification: '规格',

        price: '100',

        num: '1',

        selected: false

      }]

    }, {

      storename: '测试商家2',

      selected: false,

      goodsinfo: [{

        goodsname: '商铺2的产品1',

        specification: '规格',

        price: '100',

        num: '1',

        selected: false

      }, {

        goodsname: '商铺2的产品2',

        specification: '规格',

        price: '100',

        num: '1',

        selected: false

      }]

    }]

  },

  /**

  * 生命周期函数--监听页面加载

  */

  onLoad: function (options) {

    //获取购物车信息

  },

  /**

  * 生命周期函数--监听页面初次渲染完成

  */

  onReady: function () {

  },

  /**

  * 生命周期函数--监听页面显示

  */

  onShow: function () {

  },

  /**

  * 生命周期函数--监听页面隐藏

  */

  onHide: function () {

  },

  /**

  * 生命周期函数--监听页面卸载

  */

  onUnload: function () {

  },

  /**

  * 页面相关事件处理函数--监听用户下拉动作

  */

  onPullDownRefresh: function () {

  },

  /**

  * 页面上拉触底事件的处理函数

  */

  onReachBottom: function () {

  },

  /**

  * 用户点击右上角分享

  */

  onShareAppMessage: function () {

  },

  //计算总价格  所有选中商品的 (价格*数量)相加

  getallprices: function () {

    var cartsdata = this.data.cartsdata //购物车数据

    var allprices = 0

    let allnum = 0

    for (var i = 0; i < cartsdata.length; i++) {

      // console.log()

      var goodsinfo = cartsdata[i].goodsinfo

      for (var a = 0; a < goodsinfo.length; a++) {

        if (goodsinfo[a].selected) {

          //当前商品价格*数量 +

          let price = Number(goodsinfo[a].price)

          let num = parseInt(goodsinfo[a].num) //防止num为字符 *1或parseInt Number

          allprices += price * num

          allnum += num

        }

      }

    }

    //跟新已选数量

    this.setData({

      allnum: allnum,

      allprices: allprices.toFixed(2)

    })

  },

  //全选条件 条件->商铺全选择全选 反之

  allallprices: function () {

    let cartsdata = this.data.cartsdata

    let storenum = cartsdata.length;

    let allselected = this.data.allselected

    let allselectednum = 0;

    for (var i = 0; i < cartsdata.length; i++) {

      if (cartsdata[i].selected == true) {

        allselectednum++

      }

    }

    if (storenum == allselectednum) {

      allselected = true

    } else {

      allselected = false

    }

    this.setData({

      allselected: allselected

    })

    this.getallprices();

  },

  //全选按钮点击

  tapallallprices: function () {

    let allselected = this.data.allselected

    var cartsdata = this.data.cartsdata //购物车数据

    if (allselected) {

      allselected = false

    } else {

      allselected = true

    }

    //选择

    for (var i = 0; i < cartsdata.length; i++) {

      cartsdata[i].selected = allselected

      var goodsinfo = cartsdata[i].goodsinfo

      for (var a = 0; a < goodsinfo.length; a++) {

        goodsinfo[a].selected = allselected

      }

    }

    this.setData({

      cartsdata: cartsdata, //店铺下商品的数量

      allselected: allselected

    })

    this.getallprices();

  },

  // 店铺的选中

  storeselected: function (e) {

    var cartsdata = this.data.cartsdata //购物车数据

    let index = e.currentTarget.dataset.index //当前店铺下标

    var thisstoredata = cartsdata[index].goodsinfo //当前店铺商品数据

    //改变当前店铺状态

    if (cartsdata[index].selected) {

      cartsdata[index].selected = false

      //改变当前店铺所有商品状态

      for (var i in thisstoredata) {

        cartsdata[index].goodsinfo[i].selected = false

      }

    } else {

      cartsdata[index].selected = true

      //改变当前店铺所有商品状态

      for (var i in thisstoredata) {

        cartsdata[index].goodsinfo[i].selected = true

      }

    }

    this.setData({

      cartsdata: cartsdata //店铺下商品的数量

    })

    this.getallprices();

    this.allallprices();

  },

  // 商品的选中

  goodsselected: function (e) {

    var cartsdata = this.data.cartsdata //购物车数据

    let index = e.currentTarget.dataset.index //当前商品所在店铺中的下标

    let idx = e.currentTarget.dataset.selectIndex //当前店铺下标

    let cai = cartsdata[idx].goodsinfo; //当前商品的店铺data.goodsinfo

    let curt = cai[index]; //当前商品数组

    if (curt.selected) {

      cartsdata[idx].goodsinfo[index].selected = false //点击后当前店铺下当前商品的状态

      cartsdata[idx].selected = false

    } else {

      cartsdata[idx].goodsinfo[index].selected = true //点击后当前店铺下当前商品的状态

      //当店铺选中商品数量与店铺总数量相等时 改变店铺状态

      var storegoodsleg = cartsdata[idx].goodsinfo.length

      var goodsinfo = cartsdata[idx].goodsinfo

      var selectedleg = 0

      for (var i in goodsinfo) {

        if (goodsinfo[i].selected == true) {

          selectedleg++

        }

      }

      if (storegoodsleg == selectedleg) {

        cartsdata[idx].selected = true

      }

    }

    // 更新

    this.setData({

      cartsdata: cartsdata //店铺下商品的数量

    })

    this.getallprices();

    this.allallprices();

  },

  // 点击+号,num加1,点击-号,如果num > 1,则减1

  addCount: function (e) {

    var cartsdata = this.data.cartsdata //购物车数据

    let index = e.currentTarget.dataset.index //当前商品所在店铺中的下标

    let idx = e.currentTarget.dataset.selectIndex //当前店铺下标

    let cai = cartsdata[idx].goodsinfo; //当前商品的店铺data.goodsinfo

    let curt = cai[index]; //当前商品数组

    var num = curt.num; //当前商品的数量

    num++;

    cartsdata[idx].goodsinfo[index].num = num //点击后当前店铺下当前商品的数量

    this.setData({

      cartsdata: cartsdata //店铺下商品的数量

    })

    //计算总价格

    this.getallprices();

  },

  minusCount: function (e) {

    var cartsdata = this.data.cartsdata //购物车数据

    let index = e.currentTarget.dataset.index //当前商品所在店铺中的下标

    let idx = e.currentTarget.dataset.selectIndex //当前店铺下标

    let cai = cartsdata[idx].goodsinfo; //当前商品的店铺data.goodsinfo

    let curt = cai[index]; //当前商品数组

    var num = curt.num; //当前商品的数量

    if (num <= 1) {

      return false;

    }

    num--;

    cartsdata[idx].goodsinfo[index].num = num //点击后当前店铺下当前商品的数量

    this.setData({

      cartsdata: cartsdata //店铺下商品的数量

    })

    this.getallprices();

  }

})

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

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,028评论 0 2
  • 详情页面 packagecom.example.shoppingcar; importandroid.conten...
    ForCrazyLove阅读 567评论 0 2
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,745评论 2 9
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile丽语阅读 3,830评论 0 6
  • 月亮帶著光與雲層戀愛 黑夜更黑 連著彩虹一起帶走 戀愛需要繽紛和鮮活 於是連生命的氣息也一同帶走 黑夜失去了戀人 ...
    mi糸阅读 126评论 0 1