| @ -0,0 +1,175 @@ | |||||
| <template> | |||||
| <view class="page"> | |||||
| <view class="submit-unit"> | |||||
| <view class="title"> | |||||
| 颜色选择 | |||||
| </view> | |||||
| <view class="list"> | |||||
| <view :class="{act : unitKey.startsWith(item)}" | |||||
| 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 : unitKey.endsWith(item), | |||||
| 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] ? false : true | |||||
| }, | |||||
| 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> | |||||