<template>
|
|
<view class="page">
|
|
<view class="submit-unit">
|
|
<view class="title">
|
|
颜色选择
|
|
</view>
|
|
<view class="list">
|
|
<view :class="{act : colorIndex == index}"
|
|
v-for="(item, index) in colorList"
|
|
@click="selectUnit(item, index, 0)" :key="index">
|
|
{{ item }}
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<view class="submit-unit">
|
|
<view class="title">
|
|
尺寸选择
|
|
</view>
|
|
<view class="list">
|
|
<view
|
|
:class="{act : sizeIndex == index,
|
|
del : getUnitClassDel(item, index)}"
|
|
v-for="(item, index) in sizeList"
|
|
@click="selectUnit(item, index, 1)" :key="index">
|
|
{{ item }}
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
let defaultKey = '默认'
|
|
export default {
|
|
props : {
|
|
list : {
|
|
default : []
|
|
},
|
|
},
|
|
computed : {
|
|
unitMap(){
|
|
let map = {}
|
|
|
|
this.list.forEach(n => {
|
|
|
|
let color = n.colour || defaultKey
|
|
let title = n.title || defaultKey
|
|
|
|
let key = color + ':' + title
|
|
|
|
n.unitKeyName = color + ',' + title
|
|
|
|
map[key] = n
|
|
})
|
|
|
|
return map
|
|
},
|
|
// 尺寸列表
|
|
sizeList(){
|
|
return [...new Set(this.list.map(n => n.title || defaultKey))]
|
|
},
|
|
// 颜色列表
|
|
colorList(){
|
|
return [...new Set(this.list.map(n => n.colour || defaultKey))]
|
|
},
|
|
},
|
|
data() {
|
|
return {
|
|
unitKey : '',
|
|
colorIndex : 0,
|
|
sizeIndex : 0,
|
|
}
|
|
},
|
|
mounted() {
|
|
if(!this.unitKey && this.list.length > 0){
|
|
this.selectUnit(this.colorList[0], 0, 0)
|
|
}
|
|
},
|
|
methods: {
|
|
selectUnit(item, index, type){
|
|
if(type == 0){
|
|
let color = this.colorList[index]
|
|
for(let key in this.unitMap){
|
|
if(key.startsWith(color)){
|
|
this.unitKey = key
|
|
break
|
|
}
|
|
}
|
|
}else{
|
|
// 判断是否有货
|
|
if(this.getUnitClassDel(item, index, type)){
|
|
return
|
|
}
|
|
let color = this.colorList[this.colorIndex]
|
|
let size = this.sizeList[index]
|
|
this.unitKey = color + ':' + item
|
|
}
|
|
this.updateIndexAll()
|
|
this.$emit('selectUnit', this.unitMap[this.unitKey])
|
|
},
|
|
getUnitClassDel(item, index, type){
|
|
let key = this.colorList[this.colorIndex] + ':' + item
|
|
return !this.unitMap[key]
|
|
},
|
|
// 更新索引
|
|
updateIndexAll(){
|
|
let key = this.unitKey
|
|
|
|
this.colorList.forEach((n, i) => {
|
|
if(key.startsWith(n + ':')){
|
|
this.colorIndex = i
|
|
}
|
|
})
|
|
this.sizeList.forEach((n, i) => {
|
|
if(key.endsWith(':' + n)){
|
|
this.sizeIndex = i
|
|
}
|
|
})
|
|
},
|
|
setUnitById(id){
|
|
for(let key in this.unitMap){
|
|
if(this.unitMap[key].id == id){
|
|
this.unitKey = key
|
|
}
|
|
}
|
|
this.updateIndexAll()
|
|
},
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.page{
|
|
.submit-unit {
|
|
padding: 30rpx;
|
|
background-color: #fff;
|
|
|
|
.title {
|
|
font-size: 28rpx;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.list {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
font-size: 22rpx;
|
|
|
|
.act {
|
|
color: $uni-color;
|
|
border: 1px solid $uni-color;
|
|
background-color: #F9E7DE;
|
|
}
|
|
|
|
.del{
|
|
opacity: 0.3;
|
|
&::after{
|
|
content: '【无货】';
|
|
}
|
|
}
|
|
|
|
view {
|
|
border-radius: 15rpx;
|
|
width: 320rpx;
|
|
background-color: #eee;
|
|
border: 1px solid #eee;
|
|
margin: 10rpx;
|
|
display: flex;
|
|
justify-content: center;
|
|
padding: 15rpx 0;
|
|
overflow: hidden;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style>
|