Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >小程序购物车功能

小程序购物车功能

作者头像
黄啊码
发布于 2021-09-26 02:38:47
发布于 2021-09-26 02:38:47
85900
代码可运行
举报
运行总次数:0
代码可运行

var cart_info=[{'id':this.data.id,'cart_num':this.data.cart_num,'logo':this.data.good_info.logo,'market_price':this.data.good_info.market_price,'title':this.data.good_info.title,'checked':true}];

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
shopcart.js

data: {    'goodList': [],

    'checkAll': false,

    'totalCount': 0,

    'totalPrice': 0

  },

onLoad: function (options) {

    var that = this;

    this.setData({

      navH: app.globalData.navHeight

    });

    //设置商品列表高度

    wx.getSystemInfo({

      success: function (res) {

        that.setData({

          goodList:wx.getStorageSync('cart_info')

        })

      },

    });

  },

/**

   * 计算商品总数

   */

  calculateTotal: function () {

    var goodList = this.data.goodList;

    var totalCount = 0;

    var totalPrice = 0;

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

      var good = goodList[i];

      if (good.checked) {

        totalCount += good.cart_num;

        totalPrice += good.cart_num * good.market_price;

      }

    }

    totalPrice = totalPrice.toFixed(2);

    this.setData({

      'totalCount': totalCount,

      'totalPrice': totalPrice

    })

  },



  /**

   * 用户点击商品减1

   */

  subtracttap: function (e) {

    var index = e.target.dataset.index;

    var goodList = this.data.goodList;

    var count = goodList[index].cart_num;

    if (count <= 1) {

      return;

    } else {

      goodList[index].cart_num--;

      this.setData({

        'goodList': goodList

      });

      this.calculateTotal();

    }

  },



  /**

   * 用户点击商品加1

   */

  addtap: function (e) {

    var index = e.target.dataset.index;

    var goodList = this.data.goodList;

    var count = goodList[index].cart_num;

    goodList[index].cart_num++;

    this.setData({

      'goodList': goodList

    });

    this.calculateTotal();

  },

  /**

   * 用户选择购物车商品

   */

  checkboxChange: function (e) {

    console.log('checkbox发生change事件,携带value值为:', e.detail.value);

    var checkboxItems = this.data.goodList;

    var values = e.detail.value;

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

      checkboxItems[i].checked = false;

      for (var j = 0; j < values.length; ++j) {

        if (checkboxItems[i].id == values[j]) {

          checkboxItems[i].checked = true;

          break;

        }

      }

    }



    var checkAll = false;

    if (checkboxItems.length == values.length) {

      checkAll = true;

    }



    this.setData({

      'goodList': checkboxItems,

      'checkAll': checkAll

    });

    this.calculateTotal();

  },



  /**

   * 用户点击全选

   */

  selectalltap: function (e) {

    console.log('用户点击全选,携带value值为:', e.detail.value);

    var value = e.detail.value;

    var checkAll = false;

    if (value && value[0]) {

      checkAll = true;

    }



    var goodList = this.data.goodList;

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

      var good = goodList[i];

      good['checked'] = checkAll;

    }



    this.setData({

      'checkAll': checkAll,

      'goodList': goodList

    });

    this.calculateTotal();

  }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
shopcart.wxss
/* pages/shopcart/shopcart.wxss */

page {
  height: 100%;
  background: #fff;
  font-family: -apple-system-font, Arial, Helvetica, sans-serif;
  color: #333;
  font-size: 32rpx;
  line-height: 1.42857;
}

.container {
  width: 100%;
  min-height: 100%;
  display: flex;
  flex-direction: column;
  box-sizing: border-box;
}

.section {
  display: flex;
  flex-direction: column;
  padding-left: 30rpx;
  padding-right: 30rpx;
  margin-bottom: 30rpx;
}

.section-good {
  margin-bottom: 100rpx;
}

.good {
  display: flex;
  flex-direction: row;
  align-items: center;
  position: relative;
  height: 250rpx;
  border-bottom: 1px solid #ccc;
}

.good:last-child {
  border-bottom: none;
}

.checkbox {
  width: 48rpx;
  height: 48rpx;
}

.cover {
  width: 100%;
  height: 80%;
  border-radius: 10rpx;
  margin-left: 20rpx;
}

.content {
  flex: 1;
  margin-left: 20rpx;
}

.content .text {
  color: #363636;
  width: 450rpx;
  text-overflow: ellipsis;
  overflow: hidden;
  white-space: nowrap;
}

.content .name {
  color: #333;
  font-size: 36rpx;
}

.content .author {
  font-size: 28rpx;
  color: #363636;
  margin-top: 10rpx;
}

.content .desc {
  color: #363636;
  font-size: 28rpx;
  margin-top: 10rpx;
}

.content .press {
  font-size: 28rpx;
  color: #363636;
  margin-top: 10rpx;
}

.content .price {
  font-size: 36rpx;
  color: #e4452a;
  margin-top: 10rpx;
}

.good .stepper {
  display: flex;
  position: absolute;
  right: 0;
  bottom: 20rpx;
  flex-direction: row;
  text-align: center;
}

.stepper .add, .stepper .subtract {
  width: 50rpx;
  height: 50rpx;
  line-height: 50rpx;
  font-size: 28rpx;
  border: 1px solid #ccc;
  box-sizing: border-box;
}

.stepper .disabled {
  color: #eee;
}

.stepper .count {
  width: 60rpx;
  height: 50rpx;
  line-height: 50rpx;
  border: 1px solid #ccc;
  text-align: center;
  box-sizing: border-box;
  min-height: 1rem;
  font-size: 28rpx;
}

.section-bottom {
  display: flex;
  flex-direction: row;
  align-items: center;
  width: 100%;
  height: 100rpx;
  position: fixed;
  bottom: 0;
  left: 0;
  margin-bottom: 0;
  background-color: #fff;
  box-sizing: border-box;
  z-index: 99;
}

.section-bottom .btn {
  width: 160rpx;
  height: 100rpx;
  line-height: 100rpx;
  text-align: center;
  color: #fdfffd;
  background-color: #fbb304;
}

.section-bottom .btn-default {
  color: #363636;
  background-color: #eee;
}

.section-bottom .btn-primary {
  color: #fdfffd;
  background-color: #fbb304;
}

.section-bottom .checkbox-allcheck {
  display: inline-block;
  margin-left: 30rpx;
  vertical-align: top;
  font-size: 0px;
}

.section-bottom .check-all-text {
  display: inline-block;
  vertical-align: top;
  margin-left: 10rpx;
  height: 23px;
  line-height: 23px;
  font-size: 28rpx;
}

.section-bottom .total {
  flex: 1;
  text-align: center;
  font-size: 26rpx;
}

.total .totalCount {
  font-size: 26rpx;
  display: inline-block;
  vertical-align: middle;
}

.total .totalPrice {
  display: inline-block;
  font-size: 26rpx;
  margin-left: 20rpx;
  vertical-align: middle;
}

.total .totalCount text {
  color: #e4452a;
  vertical-align: middle;
}

.total .totalPrice text {
  color: #e4452a;
  font-size: 36rpx;
  vertical-align: middle;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
shopcart.wxml
<!--pages/shopcart/shopcart.wxml-->
<navbar parameter='{{parameter}}'></navbar>
<view class='container'>
  <view class='section section-good'>
    <checkbox-group bindchange="checkboxChange">
      <view class='good' wx:for='{{goodList}}' wx:for-item="good" wx:key="good.name">
        <label class="checkbox">
          <checkbox value="{{good.id}}" checked="{{good.checked}}" hidden='hidden' />
          <icon type="circle" size="23" wx:if="{{!good.checked}}"></icon>
          <icon type="success" size="23" wx:if="{{good.checked}}"></icon>
        </label>
        <image class='cover' mode="aspectFill" src='{{good.logo}}'></image>
        <view class='content'>
          <view class='text name'>{{good.title}}</view>
          <view class='text price'>¥{{good.market_price}}</view>
        </view>
        <view class='stepper'>
          <view class='subtract {{good.cart_num == 1 ? "disabled": ""}}' data-index='{{index}}' catchtap='subtracttap'>-</view>
          <input class='count' type='number' value='{{good.cart_num}}'></input>
          <view class='add' data-index="{{index}}" catchtap='addtap'>+</view>
        </view>
      </view>
    </checkbox-group>
  </view>
  <view class='section-bottom'>
    <checkbox-group bindchange="selectalltap">
      <label class='checkbox-allcheck'>
        <checkbox value="{{!checkAll}}" checked="{{checkAll}}" hidden='hidden' />
        <icon type="circle" size="23" wx:if="{{!checkAll}}"></icon>
        <icon type="success" size="23" wx:if="{{checkAll}}"></icon>
        <text class='check-all-text'>全选</text>
      </label>
    </checkbox-group>
    <view class="total">
      <view class='totalCount'>已选择
        <text>{{totalCount}}</text>件商品
      </view>
      <view class='totalPrice'>总价:
        <text>¥{{totalPrice}}</text>
      </view>
    </view>
    <view class='btn {{totalCount > 0 ? "btn-primary" : "btn-default"}}'>去结算</view>
  </view>
</view>

具体例子,我把代码打包放在这里,如果好用,记得回来给个赞!

https://download.csdn.net/download/TiaoZhanJi_Xian/20087582

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/07/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【愚公系列】2022年11月 微信小程序-优购电商项目-商品购物车页面
网上购物车是顾客在进行网上购物时所必须使用的购物工具。它用来临时存储用户选择的商品,协助顾客从虚拟商场中选取商品、携带商品,并到虚拟的收银台结账。
愚公搬代码
2022/11/14
4870
【愚公系列】2022年11月 微信小程序-优购电商项目-商品购物车页面
购物车
<style lang="less"> .shopcar-item-container { width: 100%; // padding-right: 42rpx; box-sizing: border-box; .border-line { height: 2rpx; z-index: 9; width: calc(~'100vw - 132rpx'); background: #eeeeee; position: absolute; bo
达达前端
2019/07/03
4K0
小程序商城订单支付界面(小程序)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142898.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/25
3.8K0
VUE实战—商品控件与购物车联动(9)
在商品组件的<template>标签内完成项目结构,以及数据,事件的绑定,与判断逻辑的书写。
前端大彬哥
2019/07/22
8700
VUE实战—商品控件与购物车联动(9)
【黄啊码】微信小程序倒计时秒杀功能
在使用完定时器后一定要清除定时器,否则定时器将一直运行,占用程序资源,甚至程序报错。关于有效清除定时器方法在微信开放社区的讨论:微信小程序使用clearInterval清除定时函数无效? | 微信开放社区
黄啊码
2021/09/26
8230
微信小程序加减号弹出框详解
<view class='add-rob' bindtap="setModalStatus" data-status="0" wx:if="{{showModalStatus}}">view> <view class='rob-box' wx:if="{{showModalStatus}}"> <view class="shade-shop-detail"> <view class="detail-right flexb"> <view class='detail-title-de'>购买数
疯狂的小程序
2018/01/25
1.8K0
微信小程序--粉丝列表 样式实现
微信小程序粉丝列表效果实现 1.效果图 2.代码实现 index.js 部分 data: { friends: [] }, index.wxml <view class="box
Kindear
2020/03/18
2.6K0
微信小程序--粉丝列表 样式实现
小程序开发笔记
最近我参与了一个小程序的开发,对于小程序开发我是零基础,所以特此记录一些小程序开发中的技术点。
用户3880999
2023/04/13
4.3K0
小程序开发笔记
微信小程序自定义登录
每次在输入框输入时,都会去触发该方法,并且带有参数,该参数(event)的 event.detail.value 值正是我们输入的最新内容,同时 event.currentTarget.id 是我们输入框设置的 id,正好可以用来区分 手机号码 和 密码。
乐心湖
2021/01/18
1.8K0
微信小程序自定义登录
Form表单类组件与Map地图组件
switch组件里有一个bindchange事件,通过该事件我们可以获得该组件的状态值,wxml代码如下:
端碗吹水
2020/09/23
1.4K0
Form表单类组件与Map地图组件
【愚公系列】2022年11月 微信小程序-优购电商项目-商品支付页面
第一、支付流程一定要简单。现代人的生活节奏是非常快速的,而且情绪比较浮躁。当用户在浏览网站的时候,遇到复杂的操作自然就会产生烦躁的心理,就是关闭网站。一个电商网站想要持续发展,在设计支付流程的时候,一定要简化,这样才能提升转化率,还可以提升用户体验。
愚公搬代码
2022/11/14
4930
【愚公系列】2022年11月 微信小程序-优购电商项目-商品支付页面
小程序百问百答
this对象在程序调用时,如点击事件中会随时改变,而var that=this之后,that没重新赋值之前仍然是指向当时的this,这样就不会出现找不到原来的对象而导致报错
用户10175992
2022/11/15
7590
小程序百问百答
小程序中表格展示数据的实现
效果图 2022-03-07_203004.png 实现步骤 页面中标签写法 <van-cell-group title="当天数据列表"> <view class='history-table-wrap'> <view class="trHead"> <view class="th th1">订单</view> <view class="th th2">线体</view> <view class="th th3">工序</view> <view cl
用户6493868
2022/03/07
1.3K0
微信小程序swipe切换及自适应高度问题解决
​ 页面代码,其中的变量这些东西需要的自己替换一下即可: <view> <view class="swiper-tab-list {{currentTab==0 ? 'on' : ''}}"
黄啊码
2021/07/23
9540
微信小程序swipe切换及自适应高度问题解决
测试平台分支-小程序端-3-小程序登录(上)
一年没更新了,今天本地运行了下都快忘了写啥了。ε=(´ο`*)))唉现在的行情还是多学习吧。
怪盗LYL
2023/09/15
4650
测试平台分支-小程序端-3-小程序登录(上)
微信小程序实战--集阅读与电影于一体的小程序项目(一)
真正的数据肯定不可能像上面那样写在wxml文件里面,而是从服务器加载的数据,下面模拟从服务器加载数据。
zhang_derek
2018/08/30
1.2K0
微信小程序实战--集阅读与电影于一体的小程序项目(一)
微信小程序 购物车代码
在判断加减数量的时候,minusStatus 这个属性是被我写在了产品的外面,所以,没做减到1的的时候,减号改变颜色,需要的可以把minusStatus 这个属性写到产品里面。。
田超
2018/07/27
2.7K0
小程序多选和单选组件的封装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
神葳
2021/01/22
9220
用uniapp写一个内外循环的全选与反选,不会的赶紧围观
根据项目需求;写的一个内外循环的全选与反选;遇到问题:由于是分页,选择全选,当上拉加载时;新加载的数据并没有被选中等问题,都被解决;如果有其他些问题;欢迎提出。
CRMEB商城源码
2022/04/12
4950
原生微信小程序实现tab切换效果demo
效果图 Wxml <!-- tab框 --> <view class="nav_title"> <view class="nav_tab"> <!-- 如果选中的下表等于当前的索引,就
peng_tianyu
2022/12/15
1K0
原生微信小程序实现tab切换效果demo
相关推荐
【愚公系列】2022年11月 微信小程序-优购电商项目-商品购物车页面
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验