zoukankan      html  css  js  c++  java
  • 微信 小程序组件 加入购物车 (终极 上线版)

    JS

    // pages/shop/shop.js
    Page({

    /**
    * 页面的初始数据
    */
    data: {
    //判断购物车是否为空时的页面
    hasList: false,
    carts:[],
    },


    // 实现bindSelectAll事件,改变全选状态
    selectedAllStatus: true,
    // 合计
    total: '',
    // 页面打开时的短暂加载数据初始化1
    newload: '',
    // minusStatuses: "disabled",

    shuaXin:function(){
     
    var that = this;
    var user = wx.getStorageSync('user')
    // 初始化数据请求
    wx.request({
    url: 'https://www.didu86.com/Clothes-manager-web/queryShoppingcar',
    data: {
    pid: user.id
    },
    success: function (res) {
    var result = res.data;
    // console.log(result);
    if (result.length != 0) {
    for (var i = 0; i < result.length; i++) {
    result[i].selected = true;
    }
    // console.log(result)
    that.setData({
    carts: result,
    hasList: true
    });
    console.log(result)
    that.newload();

    // -----------
    // 购物车专场列表数据控制函数
    // 减号被禁用时在初始化数据函
    that.minusStatuses();
    // 计算总的金额
    that.sum();

    }
    }
    });
     

    },

    /**
    * 生命周期函数--监听页面加载
    */
    onLoad: function (options) {
    var that=this;
    if (wx.getStorageSync('user')) {
    that.shuaXin()

    } else {
    wx.redirectTo({
    url: "/pages/register/register?change=1"
    })
    }
    },
     
    // -----------
    // 页面打开时的短暂加载函数3
    newload: function () {
    wx.showLoading({
    title: '加载中',
    });

    setTimeout(function () {
    wx.hideLoading()
    }, 1000);
    },
    // // -------------
    // // 购物车删除
    deleteList(e) {
    var that=this
    const index = e.currentTarget.dataset.index;
    let carts = this.data.carts;
     
    let id = carts[index].id
    // console.log(id)
    carts.splice(index, 1); // 删除购物车列表里这个商品
    wx.request({
    url: 'https://www.didu86.com/Clothes-manager-web/removeShoppingcar',
    data: {
    id: id,
    },
    success: function (res) {
    var result = res.data;
    // console.log(result)
    that.setData({
    keylist: result
    });
    }
    });
    this.setData({
    carts: carts
    });
    if (!carts.length) { // 如果购物车为空
    this.setData({
    hasList: false // 修改标识为false,显示购物车为空页面
    });
    } else { // 如果不为空
    this.sum(); // 重新计算总价格
    }

    },

    //-------------
    // 减号被禁用时在初始化数据函
    minusStatuses: function () {
    var minusStatuses = [];
    var length = this.data.carts.length;
    for (var i = 0; i < length; i++) {
    minusStatuses.push("disabled");
    }
    this.setData({
    minusStatuses: minusStatuses
    });
    },
    bindMinus: function (e) {
    var index = parseInt(e.currentTarget.dataset.index);
    var num = this.data.carts[index].num;
    var sum = this.data.carts[index].sum;
    var price = this.data.carts[index].price;
    // console.log(1);
    // 如果只有1件了,就不允许再减了
    if (num > 1) {
    num--;
    }
    // 只有大于一件的时候,才能normal状态,否则disable状态
    var minusStatus = (num <= 1 ? 'disabled' : 'normal');
    // 购物车数据
    var carts = this.data.carts;
    carts[index].num = num;
    carts[index].sum = (num * price).toFixed(1);
    // 按钮可用状态
    var minusStatuses = this.data.minusStatuses;
    minusStatuses[index] = minusStatus;
    // 将数值与状态写回
    this.setData({
    carts: carts,
    minusStatuses: minusStatuses
    });
    this.sum();
    },
    bindPlus: function (e) {
    var index = parseInt(e.currentTarget.dataset.index);
    var num = this.data.carts[index].num;
    var sum = this.data.carts[index].sum;
    var price = this.data.carts[index].price;
    // console.log(num);
    // 自增
    num++;
    // 只有大于一件的时候,才能normal状态,否则disable状态
    var minusStatus = (num <= 1) ? 'disabled' : 'normal';
    // 购物车数据
    var carts = this.data.carts;
    carts[index].num = num;
    carts[index].sum = (num * price).toFixed(1);
    // 按钮可用状态
    var minusStatuses = this.data.minusStatuses;
    minusStatuses[index] = minusStatus;
    // 将数值与状态写回
    this.setData({
    carts: carts,
    minusStatuses: minusStatuses
    });
    this.sum();
    },
    // -------------------------
    // 单击复选框是否选中
    bindCheckbox: function (e) {
    /*绑定点击事件,将checkbox样式改变为选中与非选中*/
    //拿到下标值,以在carts作遍历指示用
    var index = parseInt(e.currentTarget.dataset.index);
    //原始的icon状态
    var selected = this.data.carts[index].selected;
    var carts = this.data.carts;
    // 对勾选状态取反
    carts[index].selected = !selected;
    // console.log(carts[index].selected);
    // 写回经点击修改后的数组
    this.setData({
    carts: carts
    });
    this.sum();
    },
    // ---------------
    // 全选复选框是否选中
    bindSelectAll: function () {
    // 环境中目前已选状态
    var selectedAllStatus = this.data.selectedAllStatus;
    // 取反操作
    selectedAllStatus = !selectedAllStatus;
    // 购物车数据,关键是处理selected值
    var carts = this.data.carts;
    // 遍历
    for (var i = 0; i < carts.length; i++) {
    carts[i].selected = selectedAllStatus;
    }
    this.setData({
    selectedAllStatus: selectedAllStatus,
    carts: carts
    });
    this.sum();
    },
    // -----------------
    // 全选
    bindCheckout: function () {
    // 初始化toastStr字符串
    var toastStr = 'cid:';
    // 遍历取出已勾选的cid
    for (var i = 0; i < this.data.carts.length; i++) {
    if (this.data.carts[i].selected) {
    toastStr += this.data.carts[i].cid;
    toastStr += ' ';
    }
    }
    //存回data
    this.setData({
    // toastHidden: false,
    // toastStr: toastStr
    });
    },
    bindToastChange: function () {
    this.setData({
    // toastHidden: true
    });
    },
    // -----------------------
    // 计算总的金额
    sum: function () {
    var carts = this.data.carts;

    // 计算总金额
    var total = 0;
    for (var i = 0; i < carts.length; i++) {
    if (carts[i].selected) {
    total += carts[i].num * carts[i].price;
    }
    }
    total = total.toFixed(2);
    // 写回经点击修改后的数组
    this.setData({
    carts: carts,
    total: total
    });
    },
    // -----------------------------------------------------------

    // ------------------------------------------------------------------
    // 回tabar中的首页
    tobackHome: function () {
    wx.switchTab({
    url: '/pages/index/index'
    })
    },
    // -----------------------------------------------------------
    // 判断购物车已有商品是否有被选中
    // 立即结算点击处理函数
    orderInto: function () {
    var che = { total:'',carts:''}
     
    var that=this;
    var total=this.data.total;
    var carts = this.data.carts;
    // console.log(carts);
     
    // var selectedTotal = 0;
    var sel = [];
    for (var i = 0; i < carts.length; i++) {
     
    // selectedTotal += carts[i].selected;
    if (carts[i].selected){
    sel.push(carts[i])
    }
    }
    carts = sel
    che.total = total;
    che.carts = carts;
    if (che.carts.length > 0) {
    // 立即结算跳转至提交订单页面函数
    //--------------------------
    // 获取需要的数据
    // +'&&carts=' + JSON.stringify(carts)
    wx.navigateTo({
    url: "/pages/shopcar/order/order?che="+JSON.stringify(che)
    })
    } else {
    // if(){}
    wx.showToast({
    title: '请选择要结算的商品',
    icon: 'success',
    duration: 2000
    })
    }

    },



    /**
    * 生命周期函数--监听页面初次渲染完成
    */
    onReady: function () {

    },

    /**
    * 生命周期函数--监听页面显示
    */
    onShow: function () {
    // this.shuaXin()
    var that = this;
    // console.log("hhhhh")
    if (wx.getStorageSync('user')) {
    var user = wx.getStorageSync('user')
    // 初始化数据请求
    wx.request({
    url: 'https://www.didu86.com/Clothes-manager-web/queryShoppingcar',
    data: {
    pid: user.id
    },
    success: function (res) {
    var result = res.data;
    if (result.length != 0) {
    for (var i = 0; i < result.length; i++) {
    result[i].selected = true;
    }
    // console.log(result)
    that.setData({
    carts: result,
    hasList: true
    });
    console.log(result)
    that.newload();
    that.minusStatuses();
    // 计算总的金额
    that.sum();

    }
    else{
    that.setData({
    carts: result,
    hasList: false
    });

    }
    }
    });
    }
    },

    /**
    * 生命周期函数--监听页面隐藏
    */
    onHide: function () {

    },

    /**
    * 生命周期函数--监听页面卸载
    */
    onUnload: function () {

    },

    /**
    * 页面相关事件处理函数--监听用户下拉动作
    */
    onPullDownRefresh: function () {

    },

    /**
    * 页面上拉触底事件的处理函数
    */
    onReachBottom: function () {

    },

    /**
    * 用户点击右上角分享
    */
    onShareAppMessage: function () {

    }
    })
     
    //--------------------------------------------------------------------------------------------------------------------------------------------------
    wxml

    <!--pages/shop/shop.wxml-->
    <view wx:if="{{hasList}}" class='outer-box'>
    <!-- <block wx:key="list" wx:for="{{cartslist}}" wx:for-index=""> -->
    <!-- <view class='outer-list'> -->
    <!-- <view class='outer-list-title pad-lf white flexa f26'>
    <image src='../../imgs/shopcar/cart.png'></image>
    <text>{{item.title}}</text>
    </view> -->
    <view class="container carts-list">
    <view wx:key="isshop" wx:for="{{carts}}" class="carts-item">
    <view class="carts-choice">
    <icon wx:if="{{item.selected}}" type="success" color="rgba(255,67,66,1)" size="30" bindtap="bindCheckbox" data-index="{{index}}" />
    <icon wx:else type="success" color="rgba(255,67,66,0.1)" size="30" bindtap="bindCheckbox" data-index="{{index}}" />
    </view>
    <view class="carts-image">
    <image src="http://www.didu86.com/Clothes-manager-web/{{item.url}}"></image>
    </view>
    <view class="carts-text">
    <view class="carts-title text_overflow">
    <text>{{item.name}}</text>
    </view>
    <view class="carts-type">
    <text>{{item.color}} / {{item.size}}</text>
    </view>
    <view class="carts-subtitle">
    <text>¥{{item.price}}</text>
    </view>
    </view>
    <view class="delete">
    <!-- 垃圾桶删除 -->
    <view class="delete-img" bindtap="deleteList" data-index="{{index}}">
    <image src="../../imgs/shopcar/delete.png"></image>
    </view>
    <!-- 加减号控制数量---------------------------------------- -->
    <view class="stepper">
    <!-- 减号 -->
    <text class="{{minusStatuses[index]}}" disabled="true" data-index="{{index}}" bindtap="bindMinus">-</text>
    <!-- 数值 -->
    <!-- <input type="number" bindchange="bindManual" value="{{item.num}}" /> -->
    <view class="number" bindchange="bindManual">{{item.num}}</view>
    <!-- 加号 -->
    <text class="normal" data-index="{{index}}" bindtap="bindPlus">+</text>
    </view>
    </view>
    </view>
    </view>
    <!-- </view> -->
    <!-- </block> -->
    <!-- 全选和结算---------------------------------------- -->
    <view class="carts-footer">
    <view class="all-chioce">
    <view class="footer-left">
    <icon wx:if="{{selectedAllStatus}}" type="success" color="rgba(255,67,66,1)" size="30" bindtap="bindSelectAll" />
    <icon wx:else type="success" color="rgba(255,67,66,0.1)" size="30" bindtap="bindSelectAll" />
    <text>全选</text>
    </view>
    <view class="footer-right">
    <view class="right-text">
    <text>合计</text>
    <text>¥{{total}}</text>
    </view>
    <view class="free">
    <text>不含运费及优惠</text>
    </view>
    </view>
    </view>
    <view class="button" bindtap="orderInto">立即结算</view>
    </view>
    </view>
    <!-- 购物车缺省页 -->
    <view wx:if="{{!hasList}}" class="carts-default">
    <view>
    <view class='default-img'>
    <image src='../../imgs/shopcar/shopping_default.png'></image>
    </view>
    <text>购物车空空如也</text>
    <view class="back-box">
    <text bindtap="tobackHome">首页</text>挑几件中意在商品吧!
    </view>
    </view>
    </view>


     
    //--------------------------------------------------------------------------------------------------------------------------------------------------
    .outer-box{
    padding-bottom: 100rpx;
    }
    .outer-list{
    margin-bottom: 20rpx;
    }
    /* .outer-box .outer-list:last-child{
    margin-bottom: 0;
    } */
    .outer-list-title{
    margin-bottom: 1px;
    height: 70rpx;
    }
    .outer-list-title>image{
    30rpx;
    height: 30rpx;
    }
    .outer-list-title>text{
    margin-left: 20rpx;
    }
    /*外部容器*/
    .container {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: space-between;
    box-sizing: border-box;
    }
     
    /*整体列表*/
    .carts-list {
    display: flex;
    flex-direction: column;
    }
     
    /*每行单元格*/
    .carts-item {
    display: flex;
    flex-direction: row;
    height:240rpx;
    /*width属性解决标题文字太短而缩略图偏移*/
    100%;
    align-items: center;
    ">white;
    margin-bottom: 1px;
    position: relative;
    }
    /* 对号图标 */
    .carts-choice{
    margin-right: 20rpx;
    margin-left: 24rpx;
    }
    /*左部图片*/
    .carts-image {
    160rpx;
    height:200rpx;
    margin-right: 20rpx;
    border-radius: 10rpx;
    overflow: hidden;
    }
    .carts-image image{
    100%;
    height: 100%;
    border-radius: 10rpx;
    }
     
     
    /*右上部分标题*/
    .carts-text{
    380rpx;
    height: 160rpx;
     
    }
    .carts-title {
    /* margin: 10rpx; */
    /* 320rpx; */
    height: 76rpx;
    font-size: 28rpx;
    /* padding-right: 40rpx; */
     
    color: #333333;
    }
     
    /*右下部分价格与数量尺寸 型号*/
    .carts-type{
    font-size: 20rpx;
    margin: 11rpx 0;
    }
    .carts-subtitle {
    font-size: 30rpx;
    color:#ff4342;
    }
     
    /*加减号控制数量*/
    .stepper{
    margin-top: 72rpx;
    margin-left: 13rpx;
    display: flex;
    border-radius: 5px;
    text-align: center;
    }
    .stepper text{
    display: block;
    50rpx;
    height: 50rpx;
    border:1px solid #ddd;
    line-height: 50rpx;
    color: #cccccc;
    }
    .stepper text.normal{
    border:1px solid rgba(221,221,221,1);
    }
    .stepper text.disabled{
    border:1px solid rgba(221,221,221,0.3);
    }
    .stepper .number{
    80rpx;
    font-size: 28rpx;
    height: 50rpx;
    border: 1px solid #ddd;
    line-height: 50rpx;
    color: #333333;
    }
    .stepper text:first-child{
    border-right: none;
    border-top-left-radius: 3px;
    border-bottom-left-radius: 3px;
    }
    .stepper text:last-child{
    border-left: none;
    border-top-right-radius: 3px;
    border-bottom-right-radius: 3px;
    }
    .carts-list .delete{
    flex: 1;
    height: 100%;
    position: absolute;
    right: 0;
    top:0;
    padding-right: 24rpx;
    }
    .delete-img{
    32rpx;
    height: 32rpx;
    margin-left: 170rpx;
    margin-top: 31rpx;
    /* position: absolute; */
    /* right: 24rpx; */
    /* bottom: 20rpx; */
    }
    .delete-img image{
    100%;
    height: 100%;
    vertical-align: top;
    }


    /* 全选和区结算按钮 ********************************/
    /*底部按钮*/
    .carts-footer {
    100%;
    height: 120rpx;
    display: flex;
    /* flex-direction: row; */
    /* justify-content: space-between; */
    align-items: center;
    position: fixed;
    left: 0;
    bottom: 0;
    ">white;
    }
     
    /*复选框*/
    .carts-footer icon {
    margin-left: 20rpx;
    margin-right: 15rpx;
    }
     
    /*全选字样*/
    .carts-footer text {
    font-size: 30rpx;
    margin-left: 8rpx;
    line-height: 10rpx;
    }
    .all-chioce{
    height: 100%;
    border-top: 1px solid #dddddd;
    box-sizing: border-box;
    flex: 1;
    display: flex;
    justify-content: space-between;
    }
    .footer-left{
    190rpx;
    display: flex;
    align-items: center;
    }
    .footer-right{
    padding-right: 25rpx;
    flex: 1;
    direction: rtl;
    }
    .right-text{
    line-height: 80rpx;
    }
    .right-text text:last-child{
    color: #ff4342;
    }
    .footer-right .free{
    font-size: 20rpx;
    color:#cccccc;
    }
    /*立即结算按钮*/
    .carts-footer .button {
    line-height: 120rpx;
    text-align: center;
    260rpx;
    height: 120rpx;
    ">#ff4342;
    color: white;
    font-size: 36rpx;
    border-radius: 0;
    border: 0;
    }
    /* 全选和区结算按钮 ********************************/

    /*复选框样式*/
    /* .carts-list icon {
    margin-top: 60rpx;
    margin-right: 20rpx;
    } */
    /* 购物车缺省页************** */
    .carts-default{
    100%;
    height: 1000rpx;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 30rpx;
    }
    .carts-default view{
    text-align: center;
    }
    .default-img{
    margin: 0 auto;
    margin-bottom: 50rpx;
    }
    .carts-default .default-img{
    232rpx;
    height: 220rpx;
    }
    .carts-default .default-img image{
    100%;
    height: 100%;
    }
    .carts-default .back-box text{
    color: #FE481A;
    text-decoration:underline;
    }
    .carts-default .back-box{
    line-height: 50rpx;
    }
  • 相关阅读:
    思维探索者:理解了才是真正的学习 理解会带来巨大的好处
    思维探索者:让记忆与学习更有效率 别在别人的思考中得意着
    思维探索者:从问题到答案的思维过程 像侦探一样思考
    android-HttpClient上传信息(包括图片)到服务端
    java web每天定时执行任务
    基础总结篇之一:Activity生命周期
    Spring面试题一
    J2EE用监听器实现同一用户只能有一个在线
    notepad++快捷键大全
    python for循环巧妙运用(迭代、列表生成式)
  • 原文地址:https://www.cnblogs.com/dianzan/p/7908803.html
Copyright © 2011-2022 走看看