微信小程序购物车实现

我们要实现购物车,首先要明白的是他的需求以及实现的思路。
那么它的需求是什么呢?

1.判断购物车是否为空,空的话展示一个页面,否则展示购物车页。
2.他要有加减,用来判断用户是否在购物车原有的基础上增加或减少。
3.计算他的总价,这是必不可少的
4.判断是否显示底部结算条
5.一进页面就结算总价

那么有这几个功能,首先我们就来排版。

<!-- 购物车没有商品时显示的页面 -->
    //用wx:if判断购物车页是否有商品
	<view class="cart" wx:if="{{!none}}">
	//没有商品时显示的图片和文字
		<image src="../../images/none.jpg"></image>
		<text class="cart_tips">购物车还是空的</text>
		<text class="cart_baby">赶紧买点宝贝慰劳下自己吧</text>
		<navigator url="/pages/index/index" class="cart_callback" open-type="switchTab">去逛逛</navigator>
	</view>

当购物车有内容需要显示的页面

<!-- 购物车有商品时显示的页面 -->
	<view class="cart_do" wx:if="{{none}}">
		<!-- 购物车商品页 -->
		//通过for循环到的页面进行渲染
		<view class="cart_con" wx:for="{{none}}" wx:key="index">
			<view bindtap='checkout' data-index="{{index}}" wx:if="{{!item.check}}" class="checks"></view>
			<icon bindtap='checkout' data-index="{{index}}" wx:else color="#ec617e" type="success" size="26" />
			<image src="{{item.pic[0]}}"></image>
			<view class="cart_mations">
				<text class="goods_title">{{item.title}}</text>
				<view class="size">{{item.types}}
					<image style="margin-left:16rpx; width:20rpx;height:20rpx;" src="/images/down.png"></image>
				</view>
				<view class='zuixia'>
					<view class='price1'>{{item.price}}</view>
					<view class='add'>
						<image src='/images/cut_dis.png' class='num' style='margin-right: 4rpx;' wx:if="{{item.num == 1}}" bindtap='subtraction' data-erji="{{proind}}" data-index="{{index}}"></image>
						//购物车减
						<image src='/images/cut.png' class='num' style='margin-right: 4rpx;' wx:else data-index="{{index}}" bindtap='subtraction' data-erji="{{proind}}" data-index="{{index}}"></image>
						//原数据
						<text class="mid_num">{{item.num}}</text>
						//购物车加
						<image src='/images/add.png' class='num' style='margin-left: 4rpx;' bindtap='add' data-erji="{{proind}}" data-index="{{index}}"></image>
					</view>
				</view>
			</view>
		</view>
	</view>

下面是购物车总价的结算条

<!-- 底部结算条 -->
		<view class="bottom_bar" wx:if="{{none}}">
		    //全选
			<view class="all-check" bindtap="allChecks">
				<view wx:if="{{!allCheck}}" class="checks"></view>
				<icon wx:else color="#ec617e" type="success" size="26" />
				<text style="margin-left:20rpx;">全选</text>
			</view>
			<view class="tot-pri">
				<view style="width:200rpx; margin-right:20rpx;">
					<view class="tot">合计: <text>{{total}}</text> </view>
					<view class="freight">不含运费</view>
				</view>
			</view>
		</view>

这是购物车页的一个排版。样式比较多,大家可以自己改成自己合适的,也可以问我要。
下面看js部分

Page({

  /**
   * 页面的初始数据
   */
  data: {
    cart_list: [],
    none: null,
    //是否编辑状态
    edit: false,
    //是否全选
    allCheck: true,
    // 是否选择商品
    choose: true,
    //总价
    total: 0.00
  },

购物车加

add(e) {
    let index = e.currentTarget.dataset.index
    console.log(index)
    let none = this.data.none
    none[index].num++
    // 重新计算价格
    usual.sum(none)
    //从本地获取到total
    let total = wx.getStorageSync('total', total)
    this.setData({
      total: total,
      none: none
    })
  },

购物车减

// 购物车数量减
  subtraction(e) {
  //获取绑定在dataset上的index值
    let index = e.currentTarget.dataset.index
    let none = this.data.none
    if (none[index].num > 1) {
      none[index].num--
    } else {
    //如果商品少于一件弹出提示
      wx.showToast({
        title: "该商品一件起售哦",
        icon: "none"
      })
    }
    // 重新计算价格
    usual.sum(none)
    let total = wx.getStorageSync('total', total)
    this.setData({
      total: total,
      none: none
    })
  },

单选,全选

//单选
  checkout(e) {
    let index = e.currentTarget.dataset.index
    // console.log(index)
    let none = this.data.none
    none[index].check = !none[index].check
    // 重新计算价格
    usual.sum(none)
    let total = wx.getStorageSync('total', total)
    //把每个值遍历出来然后赋值给flag
    let flag = this.data.none.every((item) => {
      return item.check == true
    })
    this.setData({
      total: total,
      none: none,
      allCheck: flag
    })
    //调用显示结算条
    this.botbarShow()
  },
  //全选
  allChecks() {
    let allCheck = this.data.allCheck;
    let none = this.data.none;
    allCheck = !allCheck
    // console.log(allCheck)
    this.data.none.forEach((item) => {
      item.check = allCheck
    })
    // 重新计算价格
    usual.sum(none)
    let total = wx.getStorageSync('total', total)
    this.setData({
      none: this.data.none,
      allCheck,
      total: total,
    })
    //调用显示结算按钮
    this.botbarShow()
  },

是否显示底部结算条

//是否显示结算条
  botbarShow() {
    let if_show = this.data.none.every((item) => {
      return item.check == false
    })
    this.setData({
      choose: !if_show
    })
  },

在进入页面时就接收到数据,在onload里面接。

 onLoad: function (options) {
 //动态设置页面标题
    wx.setNavigationBarTitle({
      title: '购物车',
    })
    wx.request({
    //调用接口数据,这里放你需要的接口数据
      url: 'https://****/jsons/list.json',
      success: (res) => {
        let listData = wx.getStorageSync('listData') || []
        if (Array.isArray(listData)) {
          this.setData({
            none: listData
          })
        }
        this.setData({
          cart_list: res.data.result
        })
      }
    })
  },

底部结算条的计算总价

export default class usual {
  static sum(shopData) {
    //计算总价
    new Promise((res, rej) => {
      let total = 0
      for (let i = 0; i < shopData.length; i++) {
        if (shopData[i].check) {
          total += shopData[i].price * 1000 * shopData[i].num / 1000
        }
      }
      //把total设置到本地存储,并且显示方式为保留两位小数
      wx.setStorageSync('total', total.toFixed(2))
    })
  }
  static selectAll(shopData) {
    return new Promise((res, rej) => {
      //一进页面即全为选中状态
      for (let i = 0; i < shopData.length; i++) {
        let datashop = shopData[i].pro
        for (let i in datashop) {
          datashop[i].check = false
        }
      }
    })
  }
}

那么到此,购物车页面的逻辑基本就完善好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值