uni-app+uview 购物车模块组件(笔记)

<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>

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值