You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
5.2 KiB
194 lines
5.2 KiB
<template>
|
|
<ScrollView class="format-wrapper" ref="scroll" :refresh-delay="800" :list="list">
|
|
<div class="format-scroll">
|
|
<div class="format-item" @click="handleFormat({ industryName: '全部品牌', industryNameEn: 'all' }, -1)">
|
|
<div class="parent flex" :class="{ active: parentIdxRef === -1 }">
|
|
<div class="format-left flex">
|
|
<img src="../../assets/images/detail/all.svg" class="icon" alt="" />
|
|
<span class="text">{{ $t('all') }}</span>
|
|
</div>
|
|
<div class="format-right flex">
|
|
<span class="total">{{ total }}</span>
|
|
<img src="../../assets/images/detail/all_dot.svg" class="right-icon" alt="" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="format-item" v-for="(item, index) of list" :key="item.industryId">
|
|
<div
|
|
class="parent flex"
|
|
@click="handleFormat(item, index)"
|
|
:class="[index === parentIdxRef ? 'active' : '', index === parentIdxRef && childIdxRef !== -1 ? 'child-active' : '']"
|
|
>
|
|
<div class="format-left flex">
|
|
<img :src="config.sourceUrl + item.fileUrl" class="icon" alt="" />
|
|
<span class="text">{{ switchLanguage(item, 'industryName') }}</span>
|
|
</div>
|
|
<div class="format-right flex">
|
|
<span class="total">{{ item.shopNum }}</span>
|
|
<Arrow :size="18" fill="rgba(0, 0, 0, 0.2)" v-if="item.industryList?.length" class="right-icon svg-icon" />
|
|
<img src="../../assets/images/detail/all_dot.svg" class="icon" v-else alt="" />
|
|
</div>
|
|
</div>
|
|
<template v-if="item.industryList?.length">
|
|
<div class="format-child-wrapper" v-if="index === parentIdxRef">
|
|
<div class="format-item" v-for="(child, index) of item.industryList" :key="child.industryId">
|
|
<div class="parent flex" :class="{ active: childIdxRef === index }" @click="handleChildFormat(child, index)">
|
|
<div class="format-left flex">
|
|
<span class="text">{{ switchLanguage(child, 'industryName') }}</span>
|
|
</div>
|
|
<div class="format-right flex">
|
|
<span class="total">{{ child.shopNum ?? 0 }}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</div>
|
|
</div>
|
|
</ScrollView>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { computed, nextTick, ref } from 'vue'
|
|
import ScrollView from '@/base/ScrollView/ScrollView.vue'
|
|
import { Arrow } from '@/base/Svg'
|
|
|
|
const props = defineProps({
|
|
list: {
|
|
type: Array,
|
|
default: () => []
|
|
},
|
|
config: {
|
|
type: Object,
|
|
default: () => ({})
|
|
}
|
|
})
|
|
const total = computed(() => props.list.reduce((_total, item) => _total + item.shopNum, 0))
|
|
|
|
const emits = defineEmits(['click'])
|
|
emits('click', { industryName: '全部品牌', industryNameEn: 'all' }, -1)
|
|
|
|
const scroll = ref(null)
|
|
const parentIdxRef = ref(-1)
|
|
const childIdxRef = ref(-1)
|
|
function handleFormat(item, index) {
|
|
emits('click', item, index)
|
|
childIdxRef.value = -1
|
|
parentIdxRef.value = index
|
|
nextTick(() => {
|
|
scroll.value.refresh()
|
|
})
|
|
}
|
|
function handleChildFormat(child, childIdx) {
|
|
childIdxRef.value = childIdx
|
|
emits('click', child, childIdx)
|
|
nextTick(() => {
|
|
scroll.value.refresh()
|
|
})
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.format-wrapper {
|
|
overflow: hidden;
|
|
height: 810px;
|
|
border-radius: 8px;
|
|
width: 200px;
|
|
margin-top: 18px;
|
|
.format-scroll {
|
|
overflow: hidden;
|
|
border-radius: 8px;
|
|
}
|
|
.format-item {
|
|
width: 200px;
|
|
background-color: #fff;
|
|
.parent {
|
|
height: 56px;
|
|
padding: 0 12px 0 24px;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
&.active {
|
|
background: linear-gradient(90deg, #ffbd35 0%, #ffd260 100%);
|
|
.icon,
|
|
.right-icon {
|
|
filter: brightness(50) invert(70%);
|
|
&.svg-icon {
|
|
filter: none;
|
|
}
|
|
}
|
|
|
|
:deep(path) {
|
|
fill: rgba(0, 0, 0, 0.6);
|
|
}
|
|
|
|
.svg-icon {
|
|
transform: rotate(-180deg);
|
|
}
|
|
.text,
|
|
.total {
|
|
color: rgba(0, 0, 0, 0.8);
|
|
}
|
|
}
|
|
&.child-active {
|
|
background: transparent;
|
|
.icon,
|
|
.right-icon {
|
|
filter: none;
|
|
}
|
|
:deep(path) {
|
|
fill: rgba(0, 0, 0, 0.6);
|
|
}
|
|
.right-icon {
|
|
transform: rotate(-180deg);
|
|
}
|
|
.text,
|
|
.total {
|
|
color: var(--color-9b0);
|
|
}
|
|
}
|
|
}
|
|
.format-right {
|
|
.icon {
|
|
margin-left: 8px;
|
|
margin-right: 0;
|
|
}
|
|
}
|
|
.icon {
|
|
width: 16px;
|
|
height: 16px;
|
|
margin-right: 8px;
|
|
}
|
|
.text,
|
|
.total {
|
|
font-weight: 700;
|
|
font-size: 14px;
|
|
font-family: 'font_bold';
|
|
color: rgba(0, 0, 0, 0.6);
|
|
}
|
|
.total {
|
|
font-weight: 400;
|
|
font-family: 'font_regular';
|
|
color: rgba(0, 0, 0, 0.4);
|
|
}
|
|
.right-icon {
|
|
margin-left: 8px;
|
|
transition: transform 0.3s;
|
|
}
|
|
}
|
|
.format-child-wrapper {
|
|
.parent {
|
|
padding: 0 48px;
|
|
}
|
|
.text {
|
|
color: rgba(0, 0, 0, 0.4);
|
|
}
|
|
.total {
|
|
color: rgba(0, 0, 0, 0.2);
|
|
}
|
|
}
|
|
}
|
|
.flex {
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
</style>
|
|
|