微信小程序实现购物车功能


Posted in Javascript onNovember 18, 2020

本文实例为大家分享了微信小程序实现购物车功能的具体代码,供大家参考,具体内容如下

1、购物车界面功能实现

先来弄清楚购物车的需求。

  • 单选、全选和取消,而且会随着选中的商品计算出总价
  • 单个商品购买数量的增加和减少
  • 删除商品。当购物车为空时,页面会变为空购物车的布局

根据设计图,我们可以先实现静态页面。接下来,再看看一个购物车需要什么样的数据。

首先是一个商品列表(carts),列表里的单品需要:商品图(image),商品名(title),单价(price),数量(num),是否选中(selected),商品id(id)
然后左下角的全选,需要一个字段(selectAllStatus)表示是否全选了右下角的总价(totalPrice)最后需要知道购物车是否为空(hasList)
知道了需要这些数据,在页面初始化的时候我们先定义好这些。

2、下面是代码

<view class="main">
 <view wx:if="{{hasList}}">
  <view class="cart-box">
   <view class="cart-list" wx:for="{{carts}}" wx:key="{{index}}">
    <icon wx:if="{{item.selected}}" type="success" color="red" data-index="{{index}}" class="cart-pro-select" bindtap="selectList"/>
    <icon wx:else type="circle" class="cart-pro-select" data-index="{{index}}" bindtap="selectList"/>
    <navigator url="../details/details?id={{item.id}}"><image class="cart-thumb" src="{{item.image}}"/></navigator>
    <text class="cart-pro-name">{{item.title}}</text>
    <text class="cart-pro-price">¥{{item.price}}</text>
    <view class="cart-count-box">
     <text class="cart-count-down" bindtap="minusCount" data-obj="{{obj}}" data-index="{{index}}">-</text>
     <text class="cart-count-num">{{item.num}}</text>
     <text class="cart-count-add" bindtap="addCount" data-index="{{index}}">+</text>
    </view>
     <text class="cart-del" bindtap="deleteList" data-index="{{index}}">x</text>
   </view>
  </view>
   
   <view class="cart-footer">
    <icon wx:if="{{selectAllStatus}}" type="success_circle" color="#fff" class="total-select" bindtap="selectAll"/>
    <icon wx:else type="circle" color="#fff" class="total-select" bindtap="selectAll"></icon>
    <view class="order-icon">
     <navigator url="../orders/orders"><image src="/image/icon3.png" /></navigator>
    </view>
    <text>全选</text>
    <text class="cart-total-price">¥{{totalPrice}}</text>
   </view> 
 </view>
 <view wx:else>
  <view class="cart-no-data">购物车是空的哦</view>
 </view> 
</view>

js:

// page/component/cart/cart.js
Page({

 /**
 * 页面的初始数据
 */
 data: {
  carts: [], //购物车列表
  hasList: false, //列表是否有数据
  totalPrice: 0, // 总价 初始为0 
  selectAllStatus: true, // 全选状态 默认全选
  obj: {
  name: "hello"
  }
 },

 /**
 * 生命周期函数--监听页面加载
 */
 onLoad: function (options) {

 },

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

 },

 /**
 * 生命周期函数--监听页面显示
 */
 onShow: function () {
  this.setData({
   hasList: true, // 含有数据 设为true 
   carts: [
   {id: 1, title: '新鲜芹菜 半斤', image:'/image/s5.png',num:4,price: 0.01,seclected:true},
   {id: 2, title: '素米 500g', image: '/image/s6.png', num: 1, price: 0.03, seclected:true}
   ]
  });
  this.getTotalPrice();
 },
 // 当前商品选中事件
 selectList(e) {
 const index = e.currentTarget.dataset.index; //获取 data 传进来的index
 let carts = this.data.carts;   // 获取购物车列表
 const seclected = carts[index].seclected; //获取当前商品的选中状态
 carts[index].seclected = !seclected; // 改变状态
 this.setData({
  carts: carts
 });
 this.getTotalPrice();      //重新获取总价
 },

 // 删除购物车当前商品
deleteList(e) {
 const index = e.currentTarget.dataset.index;
 let carts = this.data.carts;
 carts.splice(index, 1);     // 删除购物车列表里这个商品
 this.setData({
 carts: carts
 });
 if (!carts.length) {     // 如果购物车为空
 this.setData({
  hasList: false     // 修改标识为false 显示购物车为空页面
 });
 } else {        // 如果不为空 
 this.getTotalPrice();    // 重新计算总价格
 }
},

// 购物车全选事件

selectAll(e) {
 let selectAllStatus = this.data.selectAllStatus; // 是否全选状态
 selectAllStatus = !selectAllStatus;
 let carts = this.data.carts;

 for (let i = 0; i < carts.length; i++) {
  carts[i].selected = selectAllStatus;
 }           // 改变所有商品状态
 this.setData({
  selectAllStatus: selectAllStatus,
  carts: carts
 });
 this.getTotalPrice();  //重新获取总价
},

// 绑定加数量事件
addCount(e) {
 const index = e.currentTarget.dataset.index;
 let carts = this.data.carts;
 let num = carts[index].num;
 num = num + 1;
 carts[index].num = num;
 this.setData({
 carts: carts
 });
 this.getTotalPrice();
},

// 绑定减数量事件
minusCount(e) {
 const index = e.currentTarget.dataset.index;
 const obj = e.currentTarget.dataset.obj;
 let carts = this.data.carts;
 let num = carts[index].num;
 if (num <= 1) {
  return false;
 }
 num = num - 1;
 carts[index].num = num;
 this.setData({
  carts: carts
 });
 this.getTotalPrice();
},

// 计算总价
getTotalPrice() {
  let carts = this.data.carts; // 获取购物车列表
  let total = 0;  
  for (let i = 0; i < carts.length; i ++) { // 循环列表得到每个数据
   if (carts[i].selected) { // 判断选中才会计算价格
   total += carts[i].num * carts[i].price; // 所有价格加起来
   }
  }
  this.setData({       // 最后赋值到data 中渲染到页面
  carts: carts,
  totalPrice: total.toFixed(2)
  });
},

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

 },

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

 },

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

 },

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

 },

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

 }
})

微信小程序实现购物车功能

为大家推荐现在关注度比较高的微信小程序教程一篇:《微信小程序开发教程》小编为大家精心整理的,希望喜欢。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用Javascript读取中文COOKIE的解决办法
Feb 15 Javascript
setTimeout与setInterval在不同浏览器下的差异
Jan 24 Javascript
可在线编辑网页文字效果代码(单击)
Mar 02 Javascript
js关闭浏览器窗口及检查浏览器关闭事件
Sep 03 Javascript
jquery ajaxSubmit 异步提交的简单实现
Feb 28 Javascript
JS交换变量的方法
Jan 21 Javascript
浏览器中url存储的JavaScript实现
Jul 07 Javascript
jQuery插件实现带圆点的焦点图片轮播切换
Jan 18 Javascript
javascript中JSON.parse()与eval()解析json的区别
May 19 Javascript
jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】
Aug 01 Javascript
react项目实践之webpack-dev-serve
Sep 14 Javascript
微信小程序列表中item左滑删除功能
Nov 07 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
Nov 18 #Vue.js
微信小程序实现日历小功能
Nov 18 #Javascript
微信小程序实现底部弹出模态框
Nov 18 #Javascript
微信小程序实现左滑删除效果
Nov 18 #Javascript
详解vue实现坐标拾取器功能示例
Nov 18 #Vue.js
JQuery+drag.js上传图片并且实现图片拖曳
Nov 18 #jQuery
Vue如何循环提取对象数组中的值
Nov 18 #Vue.js
You might like
php递归函数三种实现方法及如何实现数字累加
2015/08/07 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
2017/08/01 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
2017/10/25 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
javascript类继承机制的原理分析
2009/09/12 Javascript
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
JS获取当前网址、主机地址项目根路径
2013/11/19 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
2015/03/03 Javascript
jQuery实现仿百度帖吧头部固定导航效果
2015/08/07 Javascript
jQuery实现表格奇偶行显示不同背景色 就这么简单
2017/03/13 Javascript
JS简单判断字符在另一个字符串中出现次数的2种常用方法
2017/04/20 Javascript
Avalonjs双向数据绑定与监听的实例代码
2017/06/23 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
原生js实现仿window10系统日历效果的实例
2017/10/31 Javascript
解决vuejs 使用value in list 循环遍历数组出现警告的问题
2018/09/26 Javascript
[38:27]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第二场 11.26
2020/11/30 DOTA
Python的gevent框架的入门教程
2015/04/29 Python
解决python2.7 查询mysql时出现中文乱码
2016/10/09 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
2019/06/18 Python
Python shutil模块用法实例分析
2019/10/02 Python
python如何获取apk的packagename和activity
2020/01/10 Python
Python 实现打印单词的菱形字符图案
2020/04/12 Python
HTML5等待加载动画效果
2017/07/27 HTML / CSS
浅析HTML5中header标签的用法
2016/06/24 HTML / CSS
Html5页面中的返回实现的方法
2018/02/26 HTML / CSS
不用游标的SQL语句有哪些
2012/09/07 面试题
人事主管岗位职责范本
2013/12/04 职场文书
大学生咖啡店创业计划书
2014/01/21 职场文书
继承公证书样本
2014/04/04 职场文书
廉洁校园实施方案
2014/05/25 职场文书
企业安全生产标语
2014/06/06 职场文书
演讲稿开场白台词
2014/08/25 职场文书
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
python的netCDF4批量处理NC格式文件的操作方法
2022/03/21 Python
Java无向树分析 实现最小高度树
2022/04/09 Javascript