微信小程序之购物车功能


Posted in Javascript onSeptember 23, 2020

前言

以往的购物车,基本都是通过大量的 DOM 操作来实现。微信小程序其实跟 vue.js 的用法非常像,接下来就看看小程序可以怎样实现购物车功能。

需求

微信小程序之购物车功能

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

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

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

  • 首先是一个商品列表(carts),列表里的单品需要:商品图(image),商品名(title),单价(price),数量(num),是否选中(selected),商品id(id)
  • 然后左下角的全选,需要一个字段(selectAllStatus)表示是否全选了
  • 右下角的总价(totalPrice)
  • 最后需要知道购物车是否为空(hasList)

知道了需要这些数据,在页面初始化的时候我们先定义好这些。

代码实现

初始化

Page({
 data: {
  carts:[],    // 购物车列表
  hasList:false,   // 列表是否有数据
  totalPrice:0,   // 总价,初始为0
  selectAllStatus:true // 全选状态,默认全选
 },
 onShow() {
  this.setData({
   hasList: true,  // 既然有数据了,那设为true吧
   carts:[
   {id:1,title:'新鲜芹菜 半斤',image:'/image/s5.png',num:4,price:0.01,selected:true},
   {id:2,title:'素米 500g',image:'/image/s6.png',num:1,price:0.03,selected:true}
   ]
  });
  },
})

购物车列表数据我们一般是通过请求服务器拿到的数据,所以我们放在生命周期函数里给 carts 赋值。想到每次进到购物车都要获取购物车的最新状态,而onLoad和onReady只在初始化的时候执行一次,所以我需要把请求放在 onShow 函数里。(这里先拿点假数据冒充一下吧)

布局wxml

修好之前写好的静态页面,绑定数据。

<view class="cart-box">
 <!-- wx:for 渲染购物车列表 -->
 <view wx:for="{{carts}}">
 
  <!-- wx:if 是否选择显示不同图标 -->
  <icon wx:if="{{item.selected}}" type="success" color="red" bindtap="selectList" data-index="{{index}}" />
  <icon wx:else type="circle" bindtap="selectList" data-index="{{index}}"/>
  
  <!-- 点击商品图片可跳转到商品详情 -->
  <navigator url="../details/details?id={{item.id}}">
   <image class="cart-thumb" src="{{item.image}}"></image>
  </navigator>
  
  <text>{{item.title}}</text>
  <text>¥{{item.price}}</text>
  
  <!-- 增加减少数量按钮 -->
  <view>
   <text bindtap="minusCount" data-index="{{index}}">-</text>
   <text>{{item.num}}</text>
   <text bindtap="addCount" data-index="{{index}}">+</text>
  </view>
  
  <!-- 删除按钮 -->
  <text bindtap="deleteList" data-index="{{index}}"> × </text>
 </view>
</view>

<!-- 底部操作栏 -->
<view>
 <!-- wx:if 是否全选显示不同图标 -->
 <icon wx:if="{{selectAllStatus}}" type="success_circle" color="#fff" bindtap="selectAll"/>
 <icon wx:else type="circle" color="#fff" bindtap="selectAll"/>
 <text>全选</text>
 
 <!-- 总价 -->
 <text>¥{{totalPrice}}</text>
</view>

计算总价

总价 = 选中的商品1的 价格 * 数量 + 选中的商品2的 价格 * 数量 + ...
根据公式,可以得到

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)
 });
}

页面中的其他操作会导致总价格变化的都需要调用该方法。

选择事件

点击时选中,再点击又变成没选中状态,其实就是改变 selected 字段。通过 data-index="{{index}}" 把当前商品在列表数组中的下标传给事件。

selectList(e) {
 const index = e.currentTarget.dataset.index; // 获取data- 传进来的index
 let carts = this.data.carts;     // 获取购物车列表
 const selected = carts[index].selected;   // 获取当前商品的选中状态
 carts[index].selected = !selected;    // 改变状态
 this.setData({
  carts: carts
 });
 this.getTotalPrice();       // 重新获取总价
}

全选事件

全选就是根据全选状态 selectAllStatus 去改变每个商品的 selected

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();        // 重新获取总价
}

增减数量

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

// 增加数量
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;
 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();
}

删除商品

点击删除按钮则从购物车列表中删除当前元素,删除之后如果购物车为空,改变购物车为空标识hasList为false

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();   // 重新计算总价格
 } 
}

总结

虽然一个购物车功能比较简单,但是里面涉及到微信小程序的知识点还是比较多的,适合新手练习掌握。

完整的小程序商城demo含购物车,请戳:wxapp-mall

更多文章:lin-xin/blog

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

Javascript 相关文章推荐
你所要知道JS(DHTML)中的一些技巧
Jan 09 Javascript
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
Dec 28 Javascript
jQuery.extend()的实现方式详解及实例
Jun 29 Javascript
JS中把字符转成ASCII值的函数示例代码
Nov 21 Javascript
Iframe 自动适应页面的高度示例代码
Feb 26 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
Feb 20 Javascript
JS简单实现数组去重的方法分析
Oct 14 Javascript
jQuery实现的淡入淡出图片轮播效果示例
Aug 29 jQuery
layui lay-verify form表单自定义验证规则详解
Sep 18 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
Jan 21 Javascript
JS实现TITLE悬停长久显示效果完整示例
Feb 11 Javascript
JS实现页面炫酷的时钟特效示例
Aug 14 Javascript
js canvas实现QQ拨打电话特效
May 10 #Javascript
bootstrap弹出层的多种触发方式
May 10 #Javascript
详解使用vue脚手架工具搭建vue-webpack项目
May 10 #Javascript
微信小程序 支付后台java实现实例
May 09 #Javascript
使用 Vue.js 仿百度搜索框的实例代码
May 09 #Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
May 09 #Javascript
使用ES6语法重构React代码详解
May 09 #Javascript
You might like
教你如何解密 “ PHP 神盾解密工具 ”
2014/06/20 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
2014/07/24 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
使用AngularJS实现表单向导的方法
2015/06/19 Javascript
JavaScript实现旋转轮播图
2020/08/18 Javascript
Vue.js实现输入框绑定的实例代码
2017/08/24 Javascript
nodejs之koa2请求示例(GET,POST)
2018/08/07 NodeJs
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
Vue filter 过滤器、以及在table中的使用介绍
2020/09/07 Javascript
Vue切换Tab动态渲染组件的操作
2020/09/21 Javascript
解决vant中 tab栏遇到的坑 van-tabs
2020/11/04 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛 DT VS HGT
2014/05/22 DOTA
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
Python获取远程文件大小的函数代码分享
2014/05/13 Python
使用python3+xlrd解析Excel的实例
2018/05/04 Python
Python图像处理之简单画板实现方法示例
2018/08/30 Python
python自定义函数实现一个数的三次方计算方法
2019/01/20 Python
Python列表切片操作实例总结
2019/02/19 Python
python算法与数据结构之冒泡排序实例详解
2019/06/22 Python
python3多线程知识点总结
2019/09/26 Python
关于Python中定制类的比较运算实例
2019/12/19 Python
Selenium向iframe富文本框输入内容过程图解
2020/04/10 Python
python3中sys.argv的实例用法
2020/04/24 Python
Python模拟键盘输入自动登录TGP
2020/11/27 Python
英国领先的隐形眼镜在线供应商:Lenstore.co.uk
2019/11/24 全球购物
Orlebar Brown官网:设计师泳裤和泳装
2020/12/08 全球购物
设计师大码女装:11 Honoré
2020/05/03 全球购物
SQL注入攻击的种类有哪些
2013/12/30 面试题
应聘护理专业毕业自荐书范文
2014/02/12 职场文书
班干部竞选演讲稿
2014/04/24 职场文书
2014年师德承诺书
2014/05/23 职场文书
会计电算化专业求职信
2014/06/10 职场文书
英语自我介绍演讲稿
2014/09/01 职场文书
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python
通过T-SQL语句创建游标与实现数据库加解密功能
2022/03/16 SQL Server
Python Pandas 删除列操作
2022/03/16 Python