经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » 微信小程序 » 查看文章
微信小程序实现简单的购物车功能
来源:jb51  时间:2022/7/19 19:04:57  对本文有异议

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

实现一个购物车页面,需要哪些数据。整理下大概如下:
一个购物车商品列表(carts),列表里的单个item包含:商品id(id),商品图(image),商品名(title),单价(price),数量(amount),单选按钮(selected);
全选按钮,需要一个字段(selectAllStatus)表示是否全选;
总价(totalPrice);
总数量(totalNum)。
还有一个需要判断的是购物车是否为空(hasList)的字段。
购物车主要的几个功能:商品数量的加减、单选、全选、计算总价格、总数量、商品删除。

wxml代码:

  1. <!-- 购物车商品列表 -->
  2. <view class="list">
  3. ? <view wx:if="{{hasList}}">
  4. ? ? <block wx:for="{{carts}}" wx:key="id">
  5. ? ? ? <view class="item-section" bindlongpress="delItem" data-index="{{index}}">
  6. ? ? ? ? <!-- 单选按钮 是否选中显示不同的图标 -->
  7. ? ? ? ? <view class="radio-section" wx:if="{{item.selected}}" data-index="{{index}}" bindtap="changeSelect">
  8. ? ? ? ? ? <icon type="success_circle" color="#f00"></icon>
  9. ? ? ? ? </view>
  10. ? ? ? ? <view class="radio-section" wx:else ?data-index="{{index}}" bindtap="changeSelect">
  11. ? ? ? ? ? <icon type="circle" color="#ccc"></icon>
  12. ? ? ? ? </view>
  13. ? ? ? ??
  14. ? ? ? ? <view class="cart-info">
  15. ? ? ? ? ? <view class="img">
  16. ? ? ? ? ? <!-- 图片跳转到详情页 -->
  17. ? ? ? ? ? <navigator ?url="/pages/good-detail/good-detail?productId={{item.prodId}}">
  18. ? ? ? ? ? ? <image src="{{item.prodPic}}" mode="aspectFill" />
  19. ? ? ? ? ? </navigator>
  20. ? ? ? ? ? </view>
  21. ? ? ? ? ? <view class="info-rt">
  22. ? ? ? ? ? ? <view class="title">{{item.prodName}}</view>
  23. ? ? ? ? ? ? <view>
  24. ? ? ? ? ? ? ? <view class="price">¥{{item.prodPrice}}</view>
  25. ? ? ? ? ? ? ? <!-- 数量加减操作 -->
  26. ? ? ? ? ? ? ? <view class="numarea">
  27. ? ? ? ? ? ? ? ? <text class="sign num-minus" data-types="minus" data-index="{{index}}" bindtap="changeNum">-</text>
  28. ? ? ? ? ? ? ? ? <text class="num-input">{{item.amount}}</text>
  29. ? ? ? ? ? ? ? ? <text class="sign num-plus" data-types="plus" data-index="{{index}}" bindtap="changeNum">+</text>
  30. ? ? ? ? ? ? ? </view>
  31. ? ? ? ? ? ? </view>
  32. ? ? ? ? ? </view>
  33. ? ? ? ? </view>
  34. ? ? ? </view>
  35. ? ? </block>
  36. ? </view>
  37.  
  38. ? <view wx:else>
  39. ? ? <view>购物车还没有商品哦~~</view>
  40. ? ? <navigator open-type='switchTab' url="/pages/allproduct/allproduct" class="toShopping">去逛逛</navigator>
  41. ? </view>
  42. </view>
  43.  
  44. <!-- 底部操作栏 -->
  45. <view class="bottom-box">
  46. ? <view class="select-all" wx:if="{{selectAllStatus}}" data-select="{{selectAllStatus}}" bindtap="selectAll">
  47. ? ? <icon type="success_circle" color="#f00"></icon>
  48. ? ? <text>全选</text>
  49. ? </view>
  50. ? <view class="select-all" wx:else bindtap="selectAll">
  51. ? ? <icon type="circle" color="#ccc"></icon>
  52. ? ? <text>全选</text>
  53. ? </view>?
  54. ? <view class="total-price">合计:¥{{totalPrice}}</view>
  55. ? <view class="toBuy" bindtap="submitOrder" data-num ="{{totalNum}}">去结算({{totalNum}})</view>
  56. </view>

代码实现:

初始展示购物车商品

  1. Page({
  2. ? /**
  3. ? ?* 页面的初始数据
  4. ? ?*/
  5. ? ? data: {
  6. ? ? carts: [], //购物车商品列表
  7. ? ? hasList: false, // 列表是否有数据
  8. ? ? totalPrice: 0, // 总价,初始为0
  9. ? ? totalNum: 0, //去结算括号里的总数量
  10. ? ? selectAllStatus: false, // 全选状态
  11. ? ? userId: '',
  12. ? ?},
  13. ? ? //根据userId得到购物车列表数据
  14. ? getList: function() {
  15. ? ? let that = this
  16. ? ? let userId = that.data.userId
  17. ? ? let carts = that.data.carts
  18. ? ? wx.request({
  19. ? ? ? url: 'xxx.com/api/ShoppingCar/getShoppingCar?userId=' + userId,
  20. ? ? ? header: {
  21. ? ? ? ? 'content-type': 'application/json'
  22. ? ? ? },
  23. ? ? ? method: 'GET',
  24. ? ? ? success: function(res) {
  25. ? ? ? ? console.log(res)
  26. ? ? ? ? let items = res.data.items
  27. ? ? ? ? //当购物车不为空才进行后续判断操作
  28. ? ? ? ? if(items !== null){
  29. ? ? ? ? ? if (items.length > 0) {
  30. ? ? ? ? ? ? that.setData({
  31. ? ? ? ? ? ? ? hasList: true, // 有数据了,那设为true
  32. ? ? ? ? ? ? ? carts: res.data.items,
  33. ? ? ? ? ? ? ? shoppingCarId: res.data.shoppingCarId,
  34. ? ? ? ? ? ? ? buyerId: res.data.buyerId
  35. ? ? ? ? ? ? })
  36. ? ? ? ? ? } else {
  37. ? ? ? ? ? ? console.log('购物车没有商品')
  38. ? ? ? ? ? }
  39. ? ? ? ? } else{
  40. ? ? ? ? ? return false
  41. ? ? ? ? }
  42. ? ? ? },
  43. ? ? ? fail: function(res) {},
  44. ? ? ? complete: function(res) {},
  45. ? ? })
  46. ? },
  47. ??
  48. ? onShow: function(){
  49. ? ?? ?//onLoad 和onReady 只执行一次 所以数据放在onshow里每次打开页面都会执行
  50. ? ? ?this.getList()
  51. ? ? ?this.calcTotalPrice()
  52. ? ? ?this.totalNum()
  53. ? ?}
  54. ?})?

商品数量的加减:点击+号,amount 加1,点击-号,如果amount > 1,则减1;利用wxml页面中绑定的type属性,直接在方法中判断是操作加号还是减号

  1. //加减按钮操作
  2. ? changeNum: function(e) {
  3. ? ? //console.log(e)
  4. ? ? let that = this
  5. ? ? let types = e.target.dataset.types, //加和减按钮上分别设置了types属性
  6. ? ? ? index = e.target.dataset.index,
  7. ? ? ? cartsData = that.data.carts; //初始购物车列表数据
  8. ? ? console.log(cartsData[index])
  9. ? ? let amount = cartsData[index].amount
  10. ? ? if (types == 'minus') {
  11. ? ? ? if (amount <= 1) { //不允许购物车数量低于1
  12. ? ? ? ? wx.showToast({
  13. ? ? ? ? ? title: '数量不能少于1',
  14. ? ? ? ? })
  15. ? ? ? ? return false
  16. ? ? ? } else {
  17. ? ? ? ? amount = amount - 1
  18. ? ? ? ? cartsData[index].amount = amount
  19. ? ? ? ? //修改数量后重新渲染页面
  20. ? ? ? ? that.setData({
  21. ? ? ? ? ? carts: cartsData
  22. ? ? ? ? })
  23. ? ? ? }
  24. ? ? }
  25. ? ? if (types == 'plus') {
  26. ? ? ? amount = amount + 1
  27. ? ? ? cartsData[index].amount = amount
  28. ? ? ? that.setData({
  29. ? ? ? ? carts: cartsData
  30. ? ? ? })
  31. ? ? }
  32. ? ? that.calcTotalPrice()
  33. ? ? that.totalNum()
  34. ? ? wx.request({
  35. ? ? ? url: 'xxx.com/api/ShoppingCarItem/uptTransItem',
  36. ? ? ? data: {
  37. ? ? ? ? "transItemId": cartsData[index].transItemId,
  38. ? ? ? ? "prodId": cartsData[index].prodId,
  39. ? ? ? ? "amount": cartsData[index].amount,
  40. ? ? ? ? "shoppingCarId": cartsData[index].shoppingCarId
  41. ? ? ? },
  42. ? ? ? header: {
  43. ? ? ? ? 'content-type': 'application/json'
  44. ? ? ? },
  45. ? ? ? method: 'POST',
  46. ? ? ? success: function(res) {
  47. ? ? ? ? console.log(res)
  48. ? ? ? },
  49. ? ? ? fail: function(res) {},
  50. ? ? ? complete: function(res) {},
  51. ? ? })
  52. ? },

单选事件:

  1. //单个商品选中事件
  2. changeSelect: function(e) {
  3. ? ? //console.log(e)
  4. ? ? let cartsData = this.data.carts
  5. ? ? let index = e.currentTarget.dataset.index
  6. ? ? //切换选中状态
  7. ? ? cartsData[index].selected = !cartsData[index].selected
  8. ? ? // 循环数组数据,判断----选中/未选中[selected]
  9. ? ? //新定义一个flag, 当循环商品的选中状态为true,flag+1;所有商品都为选中状态,则为全选
  10. ? ? let flag = 0
  11. ? ? for (let i = 0, len = cartsData.length; i < len; i++) {
  12. ? ? ? if (cartsData[i].selected == true) {
  13. ? ? ? ? flag += 1
  14. ? ? ? }
  15. ? ? }
  16. ? ? if (cartsData.length == flag) {
  17. ? ? ? this.data.selectAllStatus = true;
  18. ? ? } else {
  19. ? ? ? this.data.selectAllStatus = false;
  20. ? ? }
  21. ? ? this.setData({
  22. ? ? ? carts: cartsData,
  23. ? ? ? selectAllStatus: this.data.selectAllStatus
  24. ? ? })
  25. ? ? this.calcTotalPrice()
  26. ? ? this.totalNum()
  27. ? },

全选事件:

  1. //购物车全选按钮
  2. ? selectAll: function(e) {
  3. ? ? //console.log(e)
  4. ? ? let selectAllStatus = e.currentTarget.dataset.select; //先判断是否为全选
  5. ? ? let cartsData = this.data.carts
  6. ? ? //将true 转为 false(所有商品未选中状态)
  7. ? ? selectAllStatus = !selectAllStatus
  8. ? ? for (let i = 0, len = cartsData.length; i < len; i++) {
  9. ? ? ? cartsData[i].selected = selectAllStatus
  10. ? ? }
  11. ? ? // 页面重新渲染
  12. ? ? this.setData({
  13. ? ? ? selectAllStatus: selectAllStatus,
  14. ? ? ? carts: cartsData
  15. ? ? })
  16. ? ? this.calcTotalPrice()
  17. ? ? this.totalNum()
  18. ? },

计算总价格:

  1. //计算商品总价
  2. //总价 = 选中的商品1的 价格 * 数量 + 选中的商品2的 价格 * 数量 + ...
  3. ? calcTotalPrice: function() {
  4. ? ? //获取商品列表数据
  5. ? ? let cartsData = this.data.carts
  6. ? ? //声明一个变量接收数组列表price
  7. ? ? let total = 0
  8. ? ? for (let i = 0, len = cartsData.length; i < len; i++) {
  9. ? ? ? if (cartsData[i].selected) { //判断选中才会计算价格
  10. ? ? ? ? total += cartsData[i].amount * cartsData[i].prodPrice;
  11. ? ? ? }
  12. ? ? }
  13. ? ? this.setData({ // 最后赋值到data中渲染到页面
  14. ? ? ? carts: cartsData,
  15. ? ? ? totalPrice: total.toFixed(2)
  16. ? ? });
  17. ? },

计算总数量:

  1. //总数量
  2. ? totalNum: function() {
  3. ? ? let cartsData = this.data.carts
  4. ? ? //新定义初始变量
  5. ? ? let totalNum = 0
  6. ? ? for (let i = 0, len = cartsData.length; i < len; i++) {
  7. ? ? ? if (cartsData[i].selected) {
  8. ? ? ? ? totalNum += cartsData[i].amount
  9. ? ? ? }
  10. ? ? }
  11. ? ? this.setData({
  12. ? ? ? totalNum: totalNum
  13. ? ? })
  14. ? },

删除单个商品:

  1. //删除商品
  2. ? delItem: function(e) {
  3. ? ? //console.log(e)
  4. ? ? let that = this
  5. ? ? let cartsData = that.data.carts
  6. ? ? let index = e.currentTarget.dataset.index
  7. ? ? wx.request({
  8. ? ? ? url: 'xxx.com/api/ShoppingCarItem/delTransItem?value=' + cartsData[index].transItemId,
  9. ? ? ? header: {
  10. ? ? ? ? 'content-type': 'application/json'
  11. ? ? ? },
  12. ? ? ? method: 'POST',
  13. ? ? ? success: function(res) {
  14. ? ? ? ? console.log(res)
  15. ? ? ? ? wx.showModal({
  16. ? ? ? ? ? title: '提示',
  17. ? ? ? ? ? content: '确认删除吗',
  18. ? ? ? ? ? success: function(res) {
  19. ? ? ? ? console.log(res)
  20. ? ? ? ? wx.showModal({
  21. ? ? ? ? ? title: '提示',
  22. ? ? ? ? ? content: '确认删除吗',
  23. ? ? ? ? ? success: function(res) {
  24. ? ? ? ? ? ? console.log(res)
  25. ? ? ? ? ? ? if (res.confirm) {
  26. ? ? ? ? ? ? ? cartsData.splice(index, 1) ?//删除购物车列表里这个商品
  27. ? ? ? ? ? ? ? that.setData({
  28. ? ? ? ? ? ? ? ? carts: cartsData
  29. ? ? ? ? ? ? ? })
  30. ? ? ? ? ? ? ? that.calcTotalPrice()
  31. ? ? ? ? ? ? ? that.totalNum()
  32. ? ? ? ? ? ? ? // 如果购物车为空
  33. ? ? ? ? ? ? ? if (cartsData.length == 0) {
  34. ? ? ? ? ? ? ? ? that.setData({ //修改标识为false,显示购物车为空页面
  35. ? ? ? ? ? ? ? ? ? hasList: false
  36. ? ? ? ? ? ? ? ? });
  37. ? ? ? ? ? ? ? }
  38. ? ? ? ? ? ? }
  39. ? ? ? ? ? }
  40. ? ? ? ? })
  41. ? ? ? },
  42. ? ? ? fail: function(res) {},
  43. ? ? ? complete: function(res) {},
  44. ? ? })
  45. ? },

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号