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


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伸缩的菜单简单示例
Dec 03 Javascript
jQuery判断当前点击的是第几个li的代码
Sep 26 Javascript
innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解
Mar 13 Javascript
jquery中validate与form插件提交的方式小结
Mar 26 Javascript
jQuery控制div实现随滚动条滚动效果
Jun 07 Javascript
js删除数组元素、清空数组的简单方法(必看)
Jul 27 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
Feb 27 Javascript
layui table设置前台过滤转义等方法
Aug 17 Javascript
react 移动端实现列表左滑删除的示例代码
Jul 04 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
Sep 11 Javascript
JS实现网站吸顶条
Jan 08 Javascript
Vue Element校验validate的实例
Sep 21 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
阿拉伯的咖啡与水烟
2021/03/03 咖啡文化
简单采集了yahoo的一些数据
2007/02/14 PHP
php 什么是PEAR?(第三篇)
2009/03/19 PHP
PHP删除数组中的特定元素的代码
2012/06/28 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
Javascript客户端将指定区域导出到Word、Excel的代码
2008/10/22 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
JavaScript表格常用操作方法汇总
2015/04/15 Javascript
浅析Node.js中使用依赖注入的相关问题及解决方法
2015/06/24 Javascript
18个非常棒的jQuery代码片段
2015/11/02 Javascript
Javascript的表单验证-揭开正则表达式的面纱
2016/03/18 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
2016/11/29 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
2017/05/09 Javascript
node.js中fs.stat与fs.fstat的区别详解
2017/06/01 Javascript
VUE元素的隐藏和显示(v-show指令)
2017/06/23 Javascript
基于JavaScript实现选项卡效果
2017/07/21 Javascript
使用vue + less 实现简单换肤功能的示例
2018/02/21 Javascript
结合Vue控制字符和字节的显示个数的示例
2018/05/17 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
react quill中图片上传由默认转成base64改成上传到服务器的方法
2019/10/30 Javascript
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
[02:30]联想杯DOTA2完美世界全国高校联赛—北京站现场
2015/11/16 DOTA
python比较两个列表大小的方法
2015/07/11 Python
python实现简单登陆流程的方法
2018/04/22 Python
python实现requests发送/上传多个文件的示例
2018/06/04 Python
python 如何利用argparse解析命令行参数
2020/09/11 Python
python如何使用腾讯云发送短信
2020/09/17 Python
python定时截屏实现
2020/11/02 Python
Nike瑞典官方网站:Nike.com (SE)
2018/11/26 全球购物
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
工作疏忽、懈怠的检讨书
2014/09/11 职场文书
保外就医申请书范文
2015/08/06 职场文书
小数乘法教学反思
2016/02/22 职场文书
解决tk mapper 通用mapper的bug问题
2021/06/16 Java/Android
Spring Data JPA框架自定义Repository接口
2022/04/28 Java/Android