美文网首页
微信小程序开发之自定义购物车

微信小程序开发之自定义购物车

作者: Just丶Go | 来源:发表于2018-06-07 16:52 被阅读0次
    购物车展示.gif

    不啰嗦直接上代码
    代码里都有详细注释

    另在wxml中已经使用<template></template>将每个item进行封装

    .js 代码

    
    var app = getApp();
    Page({
    
      /**
       * 页面的初始数据
       */
      data: {
        shopping_list: [],  // 购物车列表
        is_edit: false, // 是否编辑过, 若编辑过则页面消失时会提交接口
        is_all_selected: false, // 购物车是否全部被选中
        selected_count: 0, // 被选中的数量
        total_money: 0,
      },
      /**
       * 购买操作
       */
      buyAction: function(e) {
        var that = this
        console.log("结算!")
        // 检测是否有勾选商品
        if (!(this.data.selected_count >0)) {
          wx.showToast({
            title: '您还没有选择商品哦',
            icon: "none",
            complete: function () {
    
            }
          })
          return
        }
        var selected_list = []
        for (var i = 0; i < this.data.shopping_list.length; i++) {
          if (this.data.shopping_list[i].is_selected) {
            selected_list.push(this.data.shopping_list[i])
          }
        }
        // 跳至结算页
        wx.navigateTo({
          url: 'order_pay/order_pay?selected_list=' + selected_list,
        })
    
      },
    
      /**
       * 选择按钮 是否选中事件
       */
      selectionAction: function(e) {
        var index = e.currentTarget.dataset.index
        var cur_cell = this.data.shopping_list[index]
        cur_cell.is_selected = !cur_cell.is_selected
        this.setData({
          shopping_list: this.data.shopping_list,
          is_edit: true // 编辑过
        })
        // 判断是否全部选中
        this.isAllSelected()
        console.log(index)
      },
      /** 
       * 全选按钮
       */
      selectedAllAction: function (e) {
        // 设置按钮状态
        this.setData({
          is_all_selected: !this.data.is_all_selected
        })
        if (this.data.is_all_selected) { // 若全选
          this.setIs_selected(this.data.shopping_list, true)
          // 
          this.isAllSelected()
        } else { // 若全部取消
          this.setIs_selected(this.data.shopping_list, false)
          // 
          this.isAllSelected()
        }
      },
      // 设置模型中的is_selected字段
      setIs_selected: function (list, isSelected) {
        for (var i = 0; i < list.length; i++) {
          var item = list[i]
          item.is_selected = isSelected
        }
        this.setData({
          shopping_list: list
        })
      },
      /**
       * 设置属性值
       * 是否全部选中、      选中的数量、      选中商品的总价
       * is_all_selected、selected_count、total_money
       */
      isAllSelected: function() {
        // 循环遍历查看是否全部选中
        var count = 0
        var total_pay = 0
        for (var i = 0; i < this.data.shopping_list.length; i++) {
          // 若选中, 则增加
          if (this.data.shopping_list[i].is_selected) {
            count++
            var price = this.data.shopping_list[i].count * this.data.shopping_list[i].salesPrice
            // 设置售价
            total_pay += price 
          }
        }
    
        //  赋值总花费、选中数量
        this.setData({
          selected_count: count,
          total_money: total_pay
        })
        // 赋值成员变量selected_count 
        // 若选中的数量count == 购物车列表长度, 则全选;反之, 不全选
        if (count == this.data.shopping_list.length) {
          this.setData({
            is_all_selected: true
          })
        } else {
          this.setData({
            is_all_selected: false
          })
        }
        
      },
      /**
       * 数量+++++
       */
      addAction: function(e) {
        var index = e.currentTarget.dataset.index
        var cur_cell = this.data.shopping_list[index]
        cur_cell.count++
        this.setData({
          shopping_list: this.data.shopping_list,
          is_edit: true // 编辑过
        })
    
        // 
        this.isAllSelected()
        /**
         * 提交修改后的数据
         * 将修改后的数据提交时机放到页面离开时```
         * /api/XingluShoppingCar/EditAmount
         * 
         */
        console.log("增加")
        console.log(cur_cell)
    
      },
      /**
       * 数量-----
       */
      subAction: function(e) {
        var index = e.currentTarget.dataset.index
        var cur_cell = this.data.shopping_list[index]
        cur_cell.count > 1 ? cur_cell.count-- : cur_cell.count
        this.setData({
          shopping_list: this.data.shopping_list
        })
        // 
        this.isAllSelected()
    
        console.log("减少")
        console.log(cur_cell)
      },
      /**
       * 删除购物车中某件商品
       */
      deleteAction: function(e) {
        var that = this
        wx.showModal({
          title: '确定要删除该商品吗',
          confirmColor: "#d32433",
          success: function(res) {
            if (res.confirm) { // 确定
              // 删除该组商品
              var index = e.currentTarget.dataset.index
              that.data.shopping_list.splice(index, 1)
              that.setData({
                shopping_list: that.data.shopping_list
              })
            } else if (res.cancel) { // 取消
    
            }
            console.log("确定?")
            console.log(res)
          },
          fail: function(err) {
            console.log("失败")
            console.log(err)
          },
          // 完成后, 判断商品是否全部选中, 以便及时更改全选按钮状态
          complete: function() {
            that.isAllSelected()
          }
        })
        
    
      },
      /**
       * 获取购物车数据
       */
      getShoppingData: function() {
        var that = this;
        wx.request({
          url: app.globalData.service_host + '获取购物车数据',
          method: "POST",
          data: { tokenName: "CA17E6EE-BF7C-48CF-83B8-EEC11EC7F0C2" },
          success: function (res) {
            console.log("购物车列表\n")
            console.log(res)
            // 为每组数据添加is_selected 字段
            if (res.data.resultData) {
              that.setIs_selected(res.data.resultData, false)
            }
    
    
          },
        })
      },
      /**
       * 生命周期函数--监听页面加载
       */
      onLoad: function (options) {
        
      },
    
      /**
       * 生命周期函数--监听页面初次渲染完成
       */
      onReady: function () {
        
      },
    
      /**
       * 生命周期函数--监听页面显示
       */
      onShow: function () {
        this.getShoppingData()
      },
    
      /**
       * 生命周期函数--监听页面隐藏
       */
      onHide: function () {
    
        // 获取购物车列表每件商品的id及数量count
        var list = []
        if (this.data.shopping_list) {
          for (var i = 0; i < this.data.shopping_list.length; i++) {
            list.push({ id: this.data.shopping_list[i].id, amount: this.data.shopping_list[i].count })
          }
        }
        
        if (!this.data.is_edit) return
        // 若编辑过,则将状态复原为默认值 false
        // 复原属性值
        this.setData({
          is_edit: false,
          is_all_selected: false,
          total_money: 0
        })
        console.log(list)
        /**
         * 页面隐藏时,提交修改后的购物车数据
         * /api/XingluShoppingCar/EditAmount
         */
        wx.request({
          url: app.globalData.service_host+ 'url:提交修改后的购物车数据',
          method: "POST",
          data: { tokenName: "CA17E6EE-BF7C-48CF-83B8-EEC11EC7F0C2", list: list},
          success: function(res) {
            console.log(res)
          },
          fail: function(err) {
            console.log("购物车修改提交失败!")
            console.log(err)
          },
        })
      },
    
      /**
       * 生命周期函数--监听页面卸载
       */
      onUnload: function () {
        
      },
    
      /**
       * 页面相关事件处理函数--监听用户下拉动作
       */
      onPullDownRefresh: function () {
        
      },
    
      /**
       * 页面上拉触底事件的处理函数
       */
      onReachBottom: function () {
        
      },
    
      /**
       * 用户点击右上角分享
       */
      onShareAppMessage: function () {
        
      }
    })
    

    .wxml

    
    <!--单品信息 item  -->
    <template name="cell">
      <view class='item'>
        <!--选择框  -->
        <image class='selection-icon'
         src='{{is_selected?"../../images/sel_sel.png":"../../images/sel_nor.png"}}' bindtap='selectionAction' data-index='{{index}}'>
        </image>
        <!--商品图  {{productImage}}-->
        <image class='product-icon'      src='{{productImage}}'></image>
        <!--商品描述、数量选择  -->
        <view class='item-desc'>
          <!--商品名 {{productName}}  -->
          <text class='name' style='font-size: 13px;'>{{productName}}</text>
          <view class='color-size'>
            <text style='font-size: 12px;'>颜色: </text>
            <!--颜色 {{colourUrl}}  -->
            <image src='{{colourUrl}}' style='width: 24rpx; height: 24rpx;'></image>
            <text style='font-size: 12px;'>;</text>
            <!--尺码 {{size}}  -->
            <text style='font-size: 10px;'>尺码: {{size}};</text>
          </view>
          <view class='counter'>
            <view class='counter-item' bindtap='subAction' data-index='{{index}}'>-</view>
            <view class='counter-line'></view>
            <!--数量 {{count}}  -->
            <text class='counter-item'>{{count}}</text>
            <view class='counter-line'></view>
            <view class='counter-item' bindtap='addAction' data-index='{{index}}'>+</view>
          </view>
        </view>
        <!--商品售价、删除  -->
        <view class='price-delete'>
          <!--售价 {{salesPrice}}  -->
          <text class='sale-price'>¥{{salesPrice}}</text>
          <!--标价 {{tagPrice}}  -->
          <text class='tag-price'>¥{{tagPrice}}</text>
          <image class='delete-icon' src='../../images/delete.jpeg' bindtap='deleteAction' data-index='{{index}}'></image>
        </view>
      </view>
    </template>
    
    <view class='container'>
    <!--传入购物车列表数据  -->
      <block wx:for="{{shopping_list}}" wx:key="shopping_list">
        <template is="cell" data="{{...item,index}}"></template>
      </block>
      <view class='bottom-line'></view>
    </view>
    
    <!--底部结算栏  -->
    <view class='bottom-line-view'></view>
    <view class='bottom-view'>
      <image class='all-selection-icon' src='{{is_all_selected?"../../images/sel_sel.png":"../../images/sel_nor.png"}}' bindtap='selectedAllAction'></image>
      <text class='total-count'>全选 ({{selected_count}})</text>
      <text class='total-money'>¥{{total_money}}</text>
      <button class='buy' bindtap='buyAction' >结 算</button>
    </view>
    

    .wxss

    
    /*  cell  */
    .item {
      display: flex;
      flex-direction: row;
      justify-content: space-around;
      align-items: center;
      height: 240rpx;
      margin-top: 20rpx;
      background-color: #fff; 
    }
    /*选择框  */
    .selection-icon {
      margin-left: 20rpx;
      width: 36rpx;
      height: 36rpx;
    }
    /*产品图  */
    .product-icon{
      width: 150rpx; 
      height: 180rpx;
    }
    /*商品描述  */
    .item-desc {
      position: relative;
      display: flex;
      flex-direction: column;
      align-self: flex-start;
      margin-top: 30rpx;
      width: 300rpx;
      height: 180rpx;
    }
    /*颜色&尺码  */
    .color-size {
      position: absolute;
      bottom: 50rpx;
      width: 100%;
      height: 50rpx;
    }
    /*数量选择器  */
    .counter {
      position: absolute;
      bottom: 0;
      display: flex;
      flex-direction: row;
      border: solid 1px #000; 
      width: 182rpx; 
      border-radius: 6rpx;
      margin-top: 20rpx;
    }
    /*加减&数量  */
    .counter-item {
      font-size: 14px; 
      width: 60rpx; 
      height: 40rpx; 
      text-align: center;
    }
    /*竖线  */
    .counter-line {
      height: 40rpx; 
      width: 1px; 
      background-color: #000;
    }
    /*价格&删除  */
    .price-delete {
      position: relative;
      display: flex;
      flex-direction: column;
      align-self: flex-start;
      align-items: flex-end;
      width: 150rpx;
      height: 180rpx;
      margin-top: 30rpx;
      margin-right: 20rpx;
    }
    /*售价  */
    .sale-price {
      font-size: 14px;
      font-weight: bold; 
    }
    /*标价  */
    .tag-price {
      font-size: 12px;
      color: #d32433;
      text-decoration: line-through;
    }
    /*删除  */
    .delete-icon {
      position: absolute;
      bottom: 0;
      width: 64rpx; 
      height: 64rpx;
    }
    /*  cell  */
    
    page {
      background-color: #f5f5f5;
    }
    .bottom-line {
      width: 100%;
      height: 120rpx;
    }
    
    .bottom-line-view {
      position: fixed;
      left: 0; bottom: 90rpx;
      width: 100%;
      height: 1px;
      background-color: #f1f1f1;
    }
    .bottom-view {
      position: fixed;
      left: 0; bottom: 0;
      width: 100%;
      height: 90rpx;
      display: flex;
      flex-direction: row;
      align-items: center;
      background-color: #fff;
    }
    .all-selection-icon {
      width: 36rpx;
      height: 36rpx;
      margin-left: 20rpx;
    }
    .total-count {
      margin-left: 30rpx;
      font-size: 14px;
      width: 130rpx;
       color: #646363; 
    }
    
    .buy {
      margin-right: 20rpx;
      width: 120rpx;
      height: 60rpx;
      font-size: 13px;
      padding: 0;
      line-height: 60rpx;
      background-color: #d32433;
      color: #fff;
    }
    .button-hover {
      opacity: 0.8;
    }
    .total-money {
      width: 160rpx;
      height: 40rpx;
      line-height: 40rpx;
      font-size: 14px;
      margin-left: 224rpx;
      text-align: right;
      font-weight: bold;
    }
    

    相关文章

      网友评论

          本文标题:微信小程序开发之自定义购物车

          本文链接:https://www.haomeiwen.com/subject/zewgsftx.html