Vant+小程序+购物车实例
图片实例,看是否是您所需要的喔。。。。

扫码小程序可看实例操作,有啥问题也可扫码加群,很希望可以帮助到你喔!

HTML部分:
<view class="cart">
<view class='top' wx:if="{{isTop}}">
<view>
<van-icon name="delete" class='delete' bindtap="emptyCart"/><text bindtap="emptyCart">清空购物车</text>
</view>
</view>
<view>
<view class="cartGoods" wx:for="{{items}}" wx:key="item" data-index="{{index}}">
<view class="sigleCheck">
<!-- wx:if 是否选择显示不同图标 -->
<icon wx:if="{{item.selected}}" type="success" color="#6167e9" bindtap="sigleCheck" data-index="{{index}}" />
<icon wx:else type="circle" bindtap="sigleCheck" data-index="{{index}}"/>
</view>
<view class="goodsImg">
<navigator url="../details/details?id={{item.id}}">
<image src="{{item.pic}}" />
</navigator>
</view>
<view class="goodsDetail">
<view class='details'>
<view class='goodsName'>
<navigator url="../details/details?id={{item.id}}">
{{item.info}}</navigator>
</view>
<text class='goodsPrice'>¥{{item.sale_price}}</text>
</view>
<view class="operate">
<van-stepper value="{{item.number}}" data-index="{{index}}" min="1" max="10" bind:plus="plus" bind:minus="minus"/>
<view class="del">
<van-icon name="close" bindtap="deleteList" data-index="{{index}}"/>
</view>
</view>
</view>
</view>
<view class="submitBar" wx:if="{{bottomBar}}">
<van-submit-bar
price="{{ totalPrice*100 }}"
button-text="买单"
bind:submit="onClickButton"
>
<!-- wx:if 是否全选显示不同图标 -->
<view class='allCheck'>
<icon wx:if="{{selectAllStatus}}" type="success_circle" color="#6167e9" bindtap="selectAll"/>
<icon wx:else type="circle" color="#6167e9" bindtap="selectAll"/>
<text class="allText">全选</text>
</view>
</van-submit-bar>
</view>
</view>
<view wx:if="{{hasList}}" class='empty'>
<view>
<image src='../../images/a.png' class='empty_pic'></image>
<view class="empty_text">购物车为空,快去添加商品吧~</view>
<view>
<van-button round type="danger" bindtap='Gohome' class='Gohome' size="large">去逛逛</van-button>
</view>
</view>
</view>
<van-notify id="custom-selector" />
<van-toast id="van-toast" />
</view>
JS部分:
1 //index.js
2 import Notify from '../vant/notify/notify';
3 import Toast from '../vant/toast/toast'; //引入toast
4 var cartData = require('../../api/cart.js');
5
6 //获取应用实例
7 const app = getApp()
8
9 Page({
10 data: {
11 isTop: true,
12 bottomBar:true, //默认底部导航
13 hasList: false, // 列表是否有数据
14 selectAllStatus: false, // 全选状态,默认全选
15 totalPrice:0, //总价
16 },
17 onLoad: function () {
18 this.setData({
19 items: cartData.cartList
20 });
21 },
22 // 减去商品
23 minus(event){
24 var items = this.data.items //获取购物车列表
25 var index = event.currentTarget.dataset.index;//获取当前点击事件的下标索引
26 var number = items[index].number //获取购物车里面的value值
27 number--
28 items[index].number=number;
29 console.log("number",number);
30 this.setData({
31 items: items
32 });
33 this.getTotalPrice(); // 重新获取总价
34 },
35 // 加
36 plus(e){
37 var items = this.data.items //获取购物车列表
38 var index = e.currentTarget.dataset.index;//获取当前点击事件的下标索引
39 var number = items[index].number //获取购物车里面的value值
40 number++
41 items[index].number = number;
42 this.setData({
43 items: items
44 });
45 this.getTotalPrice(); // 重新获取总价
46 },
47 // 单选
48 sigleCheck(e){
49 var items = this.data.items //获取购物车列表
50 var index = e.currentTarget.dataset.index;//获取当前点击事件的下标索引
51 var selected = items[index].selected //获取购物车里面的value值
52 items[index].selected = !selected;
53 this.setData({
54 items:items
55 });
56 this.getTotalPrice(); // 重新获取总价
57 },
58 // 全选
59 selectAll(e) {
60 let selectAllStatus = this.data.selectAllStatus; // 是否全选状态
61 selectAllStatus = !selectAllStatus;
62 let items = this.data.items;
63
64 for (let i = 0; i < items.length; i++) {
65 items[i].selected = selectAllStatus; // 改变所有商品状态
66 }
67 this.setData({
68 selectAllStatus: selectAllStatus,
69 items: items
70 });
71 this.getTotalPrice(); // 重新获取总价
72 },
73 // 总价
74 getTotalPrice() {
75 let items = this.data.items; // 获取购物车列表
76 let total = 0;
77 for (let i = 0; i < items.length; i++) { // 循环列表得到每个数据
78 if (items[i].selected) { // 判断选中才会计算价格
79 total+= items[i].number * items[i].sale_price; // 所有价格加起来
80 total=total
81 }
82 }
83
84 this.setData({ // 最后赋值到data中渲染到页面
85 items: items,
86 totalPrice: total
87 });
88 console.log(this.data.totalPrice)
89 },
90 // 删除商品
91 deleteList(e) {
92 const index = e.currentTarget.dataset.index;
93 let items = this.data.items;
94 items.splice(index, 1); // 删除购物车列表里这个商品
95 this.setData({
96 items: items
97 });
98 if (!items.length) { // 如果购物车为空
99 Notify({
100 text: '全部删除',
101 duration: 1000,
102 selector: '#custom-selector',
103 backgroundColor: '#fc464a'
104 });
105 this.setData({
106 hasList: true, // 修改标识为false,显示购物车为空页面
107 bottomBar: false, //底部导航隐藏
108 isTop: false,
109 });
110 } else { // 如果不为空
111 this.getTotalPrice(); // 重新计算总价格
112 Notify({
113 text: '删除一个',
114 duration: 1000,
115 selector: '#custom-selector',
116 backgroundColor: '#fc464a'
117 });
118 }
119 },
120 // 清空购物车
121 emptyCart(){
122 console.log("清空",this.data.items)
123 var items = this.data.items;
124 items = '';
125 this.setData({
126 items: items,
127 bottomBar: false,
128 hasList: true,
129 isTop: false,
130 });
131 },
132 // 购买成功
133 onClickButton() {
134 Toast.success('购买成功');
135 },
136 Gohome(){
137 wx.switchTab({
138 url: '../home/home'
139 })
140 }
141 })
CSS部分:
.cart{
background: #f7f7f7;
}
.top{
color: #666;
background: #fff;
padding: 20rpx 20rpx;
font-size: 32rpx;
display: flex;
justify-content: space-between;
}
.top .wap-nav{
vertical-align: middle;
padding-right:16rpx;
}
.delete{
padding-right:16rpx;
margin-left: 20rpx;
}
.compute,.cartGoods{
display: flex;
align-items: center;
}
.cartGoods{
justify-content: space-between;
}
.cartGoods{
background: #fff;
margin-top: 20rpx;
padding: 10px 0;
}
.goodsImg image{
width: 160rpx;
height: 160rpx
}
.goodsDetail{
margin:0 30rpx;
}
.goodsName{
color: #666;
font-size: 28rpx;
width: 80%;
}
.details{
height: 46rpx;
overflow: hidden;
display: flex;
}
.goodsPrice{
font-size: 30rpx;
color: red;
font-weight: bold;
display: inline-block;
width: 200rpx;
}
.operate{
display: flex;
margin-top:30rpx;
justify-content: space-around;
}
.sigleCheck{
margin: 0 20rpx;
}
.allCheck{
margin-left: 20rpx;
}
.allCheck icon{
vertical-align: middle;
padding-right:10rpx;
}
.empty{
background: #fff;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
color: #666;
font-size: 32rpx;
}
.empty_text{
padding: 10rpx 0 30rpx 0;
text-align: center;
}
.empty_pic{
width:400rpx;
height:250rpx;
}
.Gohome .van-button--large{
height: 80rpx;
background: #6167e9;
border: 1px solid #6167e9;
line-height: 74rpx;
font-size: 36rpx;
}
.submitBar .van-button--danger{
border: 1px solid #6167e9;
background: #6167e9;
}
Vant+小程序+购物车实例的更多相关文章
- 微信小程序购物车产品计价
微信小程序购物车产品计价: 问题:当选中商品,价格累加时会出现无限循环小数 解答:在计算前先parseFloat(变量),再计算的最后使用(变量).toFixed(2)保留两位小数 例如: jiaCa ...
- 微信小程序web-view实例
微信小程序web-view实例 index.js //index.js //获取应用实例 const app = getApp() Page({ /** * 页面的初始数据 */ data: { }, ...
- 微信小程序全选,微信小程序checkbox,微信小程序购物车
微信小程序,这里实现微信小程序checkbox,有需要此功能的朋友可以参考下. 摘要: 加减商品数量,汇总价格,全选与全不选 设计思路: 一.从网络上传入以下Json数据格式的数组 1.标题titl ...
- 微信小程序——购物车结算
项目需要做个购物车结算功能,先分析需求: 1.全选,反选的功能.当选中的个数 = 购物车的数量时,勾选全选按钮,反之则取消选中全选按钮: 2.改变选中状态时,计算总价和总数量: 3.单个产品的数量加减 ...
- 微信小程序入门实例之记事本
主要实现思想都在代码的注释中,项目源码见github 首先上项目目录 app.js文件代码如下: //app.js App({ onLaunch: function() { //调用API从本地缓存中 ...
- “完美”解决微信小程序购物车抛物动画,在连续点击时出现计算错误问题,定时器停不下来。
最近做,微信点餐小程序,遇到添加商品时出现抛物动画,参考借鉴了这位大神的方法 https://www.cnblogs.com/greengage/p/7815842.html 但出现了一个问题,连续点 ...
- 微信小程序——购物车数字加减
上一篇,我们有讲到如何造一个购物车弹层.今天来说一下,购物车数量的加减如何实现. 主要思路就是在data里面定义一个属性,属性值就是这个数量.点击+的时候就+1,点击-的时候就-1,再结合setDat ...
- 微信小程序购物车实现
1,wxml <view class="miniCart-wrap {{isIpx?'is-ipx':''}}"> <view class="miniC ...
- 微信小程序购物车功能
<view class='shop-mana'> <text class='management'>管理您的购物车</text> <text class='g ...
- 微信小程序 购物车流程
购物车流程 一.需求分析 a:全选,单选,根据选中的计算数目和总价 b:单个商品加减 c:删除一个商品 wxml 布局 <view> <view v-if="flag&qu ...
随机推荐
- TCP通信实现两个主机之间的信息交互
TCP通信概述TCP协议用来控制两个网络设备之间的点对点通信,两端设备按作用分为客户端和服务端.服务端为客户端提供服务,通常等待客户端的请求信息,有客户端请求到达之后,及时提供服务和返回响应消息:客户 ...
- 【记录】 iSCSI服务器的搭建与使用[Debian]
序言 更换系统后需要一个网络文件存储用于备份文件,本想用NFS多方便,但是timeshift不支持网络存储,备份路径必须是一个块存储设备, 但是你还必须分好文件系统,这不是多此一举???反正我只用rs ...
- Elasticsearch 实战
需求 假设现在有这么一个需求,系统接了很多的报文,需要提供全文检索,为了简化,报文目前只有类型,流水号,内容这三个字段. 索引设计 建立msg索引,映射规则如下 PUT /msg { "ma ...
- 直接使用Arrays.asList()转数组,转变类型实际为AbstractList
1.直接将数组转换为list时List的类型为AbstractList public static void main(String[] args) { String[] arr = {"A ...
- KMS服务器 激活win 和 office
环境:Debian 9.5 (Google Cloud) 切换到root用户:sudo su wget --no-check-certificate https://github.com/teddys ...
- pytorch的inverse算子转onnx失败
https://github.com/microsoft/onnxruntime-extensions/blob/main/tutorials/pytorch_custom_ops_tutorial. ...
- JS实现打字效果(_会闪烁)
背景 更新博客园个人博客时,突发奇想想要将子标题的入场特效做成类似Linux命令行输命令时的样式 效果网页:LanceEst - 博客园 (cnblogs.com) 思路和代码 1 <h2 id ...
- unity GetComponent在android端获取对象错误
PlayerObj pobj = go.GetComponent<PlayerObj>(); if (pobj && pobj.IsMyTeam()) { marchAct ...
- java.3 Java数据类型1
数据类型讲解 Java属于强类型语言 即要求变量的使用要严格符合规定,所有变量都必须严格定义以后才能使用 优点:安全性高 缺点:速度慢(相对而言) Java数据类型分为引用类型和基本类型 基本数据类型 ...
- 动态修改网页的 icon 和 title
在public的index.html中使用 link 和 title 占位(内容随意,获取到数据之后此处的内容会被覆盖) 在App.vue中调用接口获取数据,找到 link 和 title 元素,将获 ...