277 lines
9.9 KiB
Vue
277 lines
9.9 KiB
Vue
<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],[157,158]]数组
|
||
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> |