glhcp/business/components/goods-spec/goods-spec.vue

277 lines
9.9 KiB
Vue
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<u-popup v-model="showPop" height="70vh" mode="bottom" border-radius="14" :closeable="true" @close="onClose"
:safe-area-inset-bottom="true">
<view class="bg-white spec-contain">
<view class="spec-header flex">
<u-image class="m-r-20" width="180rpx" height="180rpx" border-radius="10rpx" @tap="previewImage(checkedGoods.image)"
:src="checkedGoods.image"></u-image>
<view class="goods-info">
<view class="primary flex">
<price :content="checkedGoods.price" main-size="46rpx" minor-size="38rpx" color="#FF2C3C">
</price>
</view>
<view class="sm m-t-120">
库存:{{stock}}件
</view>
</view>
</view>
<!-- 规格 -->
<view class="spec-main">
<scroll-view style="min-height: 600rpx;" scroll-y="true">
<view class="spec-list">
<view v-for="(item, index) in specList" :key="index" class="spec">
<view class="flex row-between">
<view class="name m-b-30">{{ item.name }}</view>
</view>
<view class="flex wrap">
<view v-for="(specitem, index2) in item.spec_value" :key="index2"
:class="'spec-item sm ' + ( specitem.checked ? 'checked' : '' )"
@tap="choseSpecItem(item.id, specitem.id)">
{{ specitem.value }}
</view>
</view>
</view>
</view>
</scroll-view>
</view>
</view>
</u-popup>
</template>
<script>
export default {
data() {
return {
stock: 0,//库存
checkedGoods: {},
specList: [],
showPop: false,
isSelectedAll: true, //是否全选
selectStr: '', // 已选规格
specListAll: [], // 是否全选
};
},
components: {},
props: {
show: {
type: Boolean
},
goods: {
type: Object
}
},
mounted() {},
watch: {
// 监听商品
goods(value) {
this.stock = value.stock
let specList = value.goods_spec || [];
let goodsItem = value.goods_item || [];
specList.forEach(item => {
if (item.spec_value) {
item.spec_value.forEach((specitem, specindex) => {
specitem.checked = 1;
});
}
this.specListAll[item.id] = true
});
this.specList = specList
this.checkedGoods = goodsItem.length ? goodsItem[0] : {};
},
// 监听规格
specList(value) {
const {
goods_item
} = this.goods;
let keyArr = [];
let specArr = [];
let specArrCM = []; // 个规格选中的id
value.forEach(item => {
if (item.spec_value) {
item.spec_value.forEach((specitem, indexS) => {
if (specitem.checked) {
keyArr.push(specitem.id);
specArr.push(specitem.value)
specArrCM.push(specitem.id)
}
if (indexS == item.spec_value.length - 1) {
if (specArrCM.length == item.spec_value.length) {
this.specListAll[item.id] = true
} else {
this.specListAll[item.id] = false
}
specArrCM = []
}
});
}
});
this.selectStr = specArr.join('、')
// hsz
if (!keyArr.length) return;
let key = keyArr[0];
let index = goods_item.findIndex(item => {
return item.spec_value_ids == key;
});
if (index == -1) return;
this.checkedGoods = goods_item[index]
this.$emit('change', {
detail: goods_item[index]
});
},
show(val) {
this.showPop = val
}
},
methods: {
onClose() {
this.$emit('close')
},
// 点击选中规格。
choseSpecItem(id, specid) {
this.specList.forEach(item => {
if (item.spec_value && item.id == id) {
item.spec_value.forEach(specitem => {
if (specitem.id == specid) {
if (specitem.checked == 1) {
specitem.checked = 0;
} else {
specitem.checked = 1;
}
}
});
}
});
this.specList = [...this.specList]
this.getStock();
},
getStock() {
let sku = [];
// 遍历得到sku = [[1],[157158]]数组
this.specList.forEach((item, index) => {
sku.push([])
item.spec_value.forEach(specitem => {
if (specitem.checked) {
sku[index].push(specitem.id)
}
});
});
// 算出数组多种规格组合
let keyArr = this.dkej(sku)
let stock = 0
keyArr.forEach((item) => {
const a = item.join(',')
let index = this.goods.goods_item.findIndex(item => {
return item.spec_value_ids == a;
});
if (index == -1) return;
stock += this.goods.goods_item[index].stock
})
this.stock = stock
},
dkej(arr) {
let accArr = []
for (var arrar in arr) {
arrar = arr[arrar]
let result = []
for (var i in arrar) {
if (accArr.length) {
for (var x in accArr) {
result.push(accArr[x].concat(arrar[i]))
}
} else {
result.push([arrar[i]])
}
}
accArr = result
}
return accArr
},
previewImage(current) {
uni.previewImage({
current,
// 当前显示图片的http链接
urls: [current] // 需要预览的图片http链接列表
});
}
}
};
</script>
<style lang="scss" scoped>
.spec-contain {
border-radius: 10rpx 10rpx 0 0;
overflow: hidden;
position: relative;
.close {
position: absolute;
right: 10rpx;
top: 10rpx;
}
.spec-header {
padding: 30rpx;
padding-right: 70rpx;
align-items: flex-start;
border: $-solid-border;
.vip-price {
margin: 0 24rpx;
background-color: #FFE9BA;
line-height: 36rpx;
border-radius: 6rpx;
overflow: hidden;
.price-name {
background-color: #101010;
padding: 3rpx 12rpx;
color: #FFD4B7;
position: relative;
overflow: hidden;
&::after {
content: '';
display: block;
width: 20rpx;
height: 20rpx;
position: absolute;
right: -15rpx;
background-color: #FFE9BA;
border-radius: 50%;
top: 50%;
transform: translateY(-50%);
box-sizing: border-box;
}
}
}
}
.spec-main {
.spec-list {
padding: 30rpx 20rpx;
.spec-item {
line-height: 52rpx;
padding: 0 30rpx;
background-color: #F6F6F6;
border-radius: 30rpx;
margin: 0 20rpx 20rpx 0;
border: 1rpx solid #F6F6F6;
&.checked {
font-weight: 500;
border: 1rpx solid $-color-primary;
color: #fff;
background-color: $-color-primary;
}
}
}
}
}
</style>