?
?本篇抽取demo部分功能展示,在文章结尾附上完整DEMO
一、效果图:
二、.WXML代码示例,
<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}}"></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}}">×</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"/>
<view class="order-icon">
<navigator url="../orders/orders"><image src="/image/icon3.png"></image></navigator>
</view>
<text>全选</text>
<text class="cart-toatl-price">¥{{totalPrice}}</text>
</view>
</view>
<view wx:else>
<view class="cart-no-data">购物车是空的哦~</view>
</view>
</view>
二、.JS代码示例
Page({
data: {
carts: [], // 购物车列表
hasList: false, // 列表是否有数据
totalPrice: 0, // 总价,初始为0
selectAllStatus: true, // 全选状态,默认全选
obj: {
name: "hello"
}
},
onShow() {
this.setData({
hasList: true,
carts: [ //模拟数据
{
id: 1,
title: ‘测试土豆 1斤‘,
image: ‘/pages/images/s5.png‘,
num: 4,
price: 10.00,
selected: true
},
{
id: 2,
title: ‘测试黑米 1斤‘,
image: ‘/pages/images/s6.png‘,
num: 1,
price: 5.0,
selected: true
}
]
});
this.getTotalPrice();
},
/**
* 当前商品选中事件
*/
selectList(e) {
const index = e.currentTarget.dataset.index;
let carts = this.data.carts;
const selected = carts[index].selected;
carts[index].selected = !selected;
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
});
} 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)
});
}
})
三、.XWSS代码示例
.cart-box{
padding-bottom: 100rpx;
}
.cart-list{
position: relative;
padding: 20rpx 20rpx 20rpx 285rpx;
height: 185rpx;
border-bottom: 1rpx solid #e9e9e9;
}
.cart-list .cart-pro-select{
position: absolute;
left: 20rpx;
top: 90rpx;
width: 45rpx;
height: 45rpx;
}
.cart-list .cart-thumb{
position: absolute;
top: 20rpx;
left: 85rpx;
width: 185rpx;
height: 185rpx;
}
.cart-list .cart-pro-name{
display: inline-block;
width: 300rpx;
height: 105rpx;
line-height: 50rpx;
overflow: hidden;
}
.cart-list .cart-pro-price{
display: inline-block;
float: right;
height: 105rpx;
line-height: 50rpx;
}
.cart-list .cart-count-box{
position: absolute;
left: 285;
bottom: 20rpx;
width: 250rpx;
height: 80rpx;
}
.cart-list .cart-count-box text{
display: inline-block;
line-height: 80rpx;
text-align: center;
}
.cart-count-down,.cart-count-add{
font-size: 44rpx;
width: 50rpx;
height: 100%;
}
.cart-count-num{
width: 150rpx;
}
.cart-del{
position: absolute;
right: 20rpx;
bottom: 20rpx;
width: 80rpx;
height: 80rpx;
line-height: 80rpx;
text-align: center;
font-size: 44rpx;
}
.cart-footer{
position: fixed;
bottom: 0;
left: 0;
width: 100%;
height: 90rpx;
line-height: 90rpx;
padding:0 100rpx 0 80rpx;
box-sizing: border-box;
background: #AB956D;
color: #fff;
}
.total-select{
position: absolute;
left: 20rpx;
top: 25rpx;
width: 45rpx;
height: 45rpx;
}
.order-icon{
position: absolute;
right: 40rpx;
top: 25rpx;
width: 45rpx;
height: 45rpx;
}
.order-icon image,.order-icon navigator{
display: block;
width: 45rpx;
height: 45rpx;
}
.cart-toatl-price{
float: right;
width: 120rpx;
}
.cart-no-data{
padding:40rpx 0;
color: #999;
text-align: center;
}
?四、.JSON代码示例
{
"navigationBarTitleText": "购物车"
}
? ?DEMO
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -END
?