<template>
<!-- 商品列表 -->
<view class="wee-cart">
<view class="bg"></view>
<view class="tips" v-if="goodsList.length==0">
<u-image class="tips-img" width="305" height="200" src="/static/base/shopping-cart.png"></u-image>
<view></view>
<uni-title type="h4" title="购物车竟然是空的" align="center"></uni-title>
<uni-title type="h5" title="再忙,也要记得买点什么犒劳自己 ~ღ( ´・ᴗ・` )" align="center"></uni-title>
<u-button size="medium" type="warning">去逛逛</u-button>
</view>
<view class="cart-list">
<view class="cart-item" v-for="(item,index) in goodsList" :key="item.firmId">
<view class="stylist">
<u-checkbox-group>
<u-checkbox v-model="item.selectedAll" shape="circle" @change="firmSelectedAll(index)">
<u-icon class="home" name="home" :label="item.firmName" label-color="#000"></u-icon>
<u-icon class="arrow-right" name="arrow-right" color="#aaa" size="20"></u-icon>
</u-checkbox>
</u-checkbox-group>
</view>
<view class="select-list">
<u-checkbox-group :wrap="true">
<u-checkbox @change="selectedSole(index, i)" class="select-checkbox" shape="circle" v-model="goods.selected"
v-for="(goods, i) in item.goods" :key="goods.id" :name="goods.name">
<view class="select-item" @tap.stop>
<u-image :src="goods.img" class="img" border-radius="10" width="160" height="160"></u-image>
<view class="goods-info">
<view class="name">{{goods.name}}</view>
<view class="size">{{goods.spec}}
<u-icon class="arrow-down" name="arrow-down" size="20"></u-icon>
</view>
<view class="data-num">
<view class="price">¥<text>{{goods.price}}</text>
</view>
<view>
<u-number-box v-model="goods.number" :min="1" @minus="sub(index,i)" @plus="add(index,i)"></u-number-box>
</view>
</view>
</view>
</view>
</u-checkbox>
</u-checkbox-group>
</view>
</view>
</view>
<view class="navigation">
<view class="left">
<view class="item">
<u-checkbox-group>
<u-checkbox v-model="isSelectedAllRow" :disabled="!goodsList.length" shape="circle" @change="selectedAllRow">
全选
</u-checkbox>
</u-checkbox-group>
</view>
<view class="item">
<view class="goods-remove u-line-1" v-if="selectedAllRowLength" @click="removeGoodsEvent">
<u-icon name="trash-fill" size="30" color="#ff3300" label-color="#ff3300" label="删除"></u-icon>
</view>
</view>
</view>
<view class="right">
<view class="total-cost u-line-1">总价格<text class="red-price">¥{{sumPrice}}</text></view>
<view class="buy btn u-line-1" @tap="common.openPages(1,'/pages/store/user/submit-order')">结算<text v-if="selectedAllRowLength">({{selectedAllRowLength}})</text></view>
</view>
</view>
</view>
</template>
<script>
export default {
name: 'weeCart',
data() {
return {
goodsList: [{
firmId: 101,
firmName: '商铺名称',
selectedAll: false,
goods: [{
id: 1,
img: '/static/images/10.png',
name: '商品标题1',
spec: '规格:S码',
price: 127.5,
number: 1,
selected: false
}, {
id: 2,
img: '/static/images/10.png',
name: '商品标题商品标题商品标2商品标题商品标题商品标商品标题商品标题商品标商品标题商品标题商品标商品标题商品标题商品标',
spec: '规格:S码',
price: 2.5,
number: 2,
selected: false
}]
}, {
firmId: 102,
firmName: 'GeekFun',
selectedAll: false,
goods: [{
id: 3,
img: '/static/images/10.png',
name: '商品标题1',
spec: '规格:S码',
price: 127.5,
number: 1,
selected: false
}]
}, {
firmId: 103,
firmName: 'GeekFun',
selectedAll: false,
goods: [{
id: 3,
img: '/static/images/10.png',
name: '商品标题1',
spec: '规格:S码',
price: 127.5,
number: 1,
selected: false
}]
}, {
firmId: 104,
firmName: 'GeekFun',
selectedAll: false,
goods: [{
id: 3,
img: '/static/images/10.png',
name: '商品标题1',
spec: '规格:S码',
price: 127.5,
number: 1,
selected: false
}]
}, {
firmId: 105,
firmName: 'GeekFun',
selectedAll: false,
goods: [{
id: 3,
img: '/static/images/10.png',
name: '商品标题1',
spec: '规格:S码',
price: 127.5,
number: 1,
selected: false
}]
}],
isSelectedAllRow: false, // 全选所有商品
selectedAllRowList: [], // 储存一个已经选择的数据
selectedAllRowLength: 0, // 已经选择了的数据的长度
sumPrice: '0.00' // 总价格
}
},
methods: {
/**
* 数字步进 减
* @param {Object} m 父 索引
* @param {Object} n 子 索引
*/
sub(m, n) {
if (this.goodsList[m].goods[n].number <= 1) {
return
}
this.goodsList[m].goods[n].number--
this.sumTotalPrice()
},
/**
* 数字步进 加
* @param {Object} m 父 索引
* @param {Object} n 子 索引
*/
add(m, n) {
this.goodsList[m].goods[n].number++
this.sumTotalPrice()
},
/**
* 选择单个商品
* @param {Object} m 父 索引
* @param {Object} n 子 索引
*/
selectedSole(m, n) {
this.goodsList[m].goods[n].selected = !this.goodsList[m].goods[n].selected
// 循环设置父全选 如果全部选中 则父全选选中 否则 不选中
for (let i = 0; i < this.goodsList[m].goods.length; i++) {
if (this.goodsList[m].goods[i].selected) {
this.goodsList[m].selectedAll = true
} else {
this.goodsList[m].selectedAll = false
break
}
}
this.computeSelectedAll()
this.sumTotalPrice()
},
/**
* 全选 当前店铺下所有的商品
* @param {Object} index 索引值
*/
firmSelectedAll(index) {
this.goodsList[index].selectedAll = !this.goodsList[index].selectedAll;
for (let i = 0; i < this.goodsList[index].goods.length; i++) {
this.goodsList[index].goods[i].selected = this.goodsList[index].selectedAll
}
this.computeSelectedAll()
this.sumTotalPrice()
},
// 全选所有行
selectedAllRow() {
this.isSelectedAllRow = this.goodsList.length ? !this.isSelectedAllRow : false
let len = this.goodsList.length
for (let i = 0; i < len; i++) {
this.goodsList[i].selectedAll = this.isSelectedAllRow
for (let j = 0; j < this.goodsList[i].goods.length; j++) {
this.goodsList[i].goods[j].selected = this.goodsList[i].selectedAll
}
}
this.sumTotalPrice()
},
// 判断全部商品选择
computeSelectedAll() {
for (let i = 0; i < this.goodsList.length; i++) {
if (this.goodsList[i].selectedAll) {
this.isSelectedAllRow = true
} else {
this.isSelectedAllRow = false
break
}
}
},
// 合计总价格
sumTotalPrice() {
// 获取选择信息
this.getSelectedInfoList()
this.sumPrice = 0
this.selectedAllRowLength = 0
for (let i = 0; i < this.selectedAllRowList.length; i++) {
for (let j = 0; j < this.selectedAllRowList[i].goods.length; j++) {
this.sumPrice += this.selectedAllRowList[i].goods[j].price * this.selectedAllRowList[i].goods[j].number
}
this.selectedAllRowLength += this.selectedAllRowList[i].goods.length
}
this.sumPrice = this.sumPrice.toFixed(2)
},
/* 获取选择数据 */
getSelectedInfoList() {
let len = this.goodsList.length
this.selectedAllRowList = []
for (let i = 0; i < len; i++) {
if (this.goodsList[i].selectedAll) {
this.selectedAllRowList.push(this.goodsList[i])
} else {
for (let j = 0; j < this.goodsList[i].goods.length; j++) {
if (this.goodsList[i].goods[j].selected) {
this.selectedAllRowList.push(this.copyTowArr(i, j))
} else {
continue
}
}
}
}
},
/* 二位数组复制 */
copyTowArr(m, n) {
let arr = {}
for (let key in this.goodsList[m]) {
arr[key] = this.goodsList[m][key]
}
arr.goods = []
arr.goods.push(this.goodsList[m].goods[n])
return arr
},
/* 删除数据从对象中 */
deleteDataFromObj() {
let itemArr = []
for (let i = 0; i < this.goodsList.length; i++) {
let item = []
let len = Object.keys(JSON.stringify(this.goodsList[i].goods)).length
for (let j = 0; j < this.selectedAllRowList.length; j++) {
for (let k = 0; k < this.selectedAllRowList[j].goods.length; k++) {
let addr = JSON.stringify(this.goodsList[i].goods).indexOf(JSON.stringify(this.selectedAllRowList[j].goods[k]))
if (addr > 1) {
for (let x in this.goodsList[i].goods) {
let len1 = Object.keys(JSON.stringify(this.goodsList[i].goods[x])).length
let num = addr - len1 - 1
if (num < 0) {
break
} else {
item.push(num)
}
}
} else {
item.push(addr - 1)
}
}
}
itemArr.push(item)
}
for (let i = itemArr.length - 1; i >= 0; i--) {
let towArr = itemArr[i]
for (let x = towArr.length; x > 0; x--) {
console.log(towArr[x - 1])
if (towArr[x - 1] > -1) {
this.goodsList[i].goods.splice(towArr[x - 1], 1)
} else {
continue
}
}
if (!this.goodsList[i].goods.length) {
this.goodsList.splice(i, 1)
}
}
this.selectedAllRowList = []
this.isSelectedAllRow = false
this.computeSelectedAll()
this.sumTotalPrice()
},
/* 将商品移出购物出 */
removeGoodsEvent() {
uni.showLoading()
// 请求接口写在此位置
this.deleteDataFromObj()
setTimeout(function() {
uni.hideLoading()
}, 800)
}
}
}
</script>
<style lang="scss" scoped>
page {
background-color: $uni-bg-color-grey;
}
.wee-cart {
position: relative;
overflow: hidden;
.bg {
width: 100%;
height: 200rpx;
background-color: #FFE60F;
position: absolute;
top: 0;
}
.tips {
position: relative;
z-index: 1;
text-align: center;
.tips-img {
display: block;
margin: 250rpx auto 0;
}
}
}
.cart-list {
padding: 20rpx;
position: relative;
z-index: 1;
margin-bottom: 110rpx;
.cart-item {
background-color: #FFF;
border-radius: 30rpx;
padding: 20rpx;
margin-bottom: 20rpx;
background-color: #FFF;
.stylist {
.home,
.arrow-right {
margin-left: 15rpx;
}
}
.select-list {
.select-checkbox {
padding: 20rpx 0;
border-bottom: 2rpx solid #EEE;
&:last-child {
border: none;
}
.select-item {
display: flex;
align-items: center;
.img {
margin-left: 15rpx;
}
.goods-info {
width: 410rpx;
margin-left: 15rpx;
.name {
color: #000;
font-size: 26rpx;
@include line();
}
.size {
color: #484848;
font-size: 24rpx;
background-color: #eee;
padding: 5rpx 10rpx;
border-radius: 25rpx;
width: 200rpx;
display: flex;
justify-content: space-around;
margin: 10rpx 0 20rpx;
.arrow-down {
margin-left: 10rpx;
}
}
.data-num {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
.price {
font-size: 28rpx;
color: red;
.num {
font-size: 40rpx;
font-weight: bold;
}
}
}
}
}
}
}
}
}
.navigation {
display: flex;
align-items: center;
justify-content: space-between;
border: solid 2rpx #f2f2f2;
background-color: #ffffff;
padding: 16rpx;
position: fixed;
bottom: 0;
z-index: 1;
width: 100%;
.left {
display: flex;
font-size: 20rpx;
.item {
margin: 0 20rpx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
}
.right {
display: flex;
font-size: 28rpx;
align-items: center;
.btn {
line-height: 66rpx;
padding: 0 30rpx;
border-radius: 36rpx;
color: #ffffff;
}
.total-cost {
margin-right: 30rpx;
.red-price {
color: red
}
}
.buy {
background-color: #ff7900;
}
}
}
</style>
uni-app+uview 购物车模块组件(笔记)
最新推荐文章于 2025-02-26 10:22:18 发布