Spaces:
Sleeping
Sleeping
<template> | |
<div class="resource-select"> | |
<van-checkbox-group v-model="selectedResourceIds"> | |
<van-cell-group :border="false"> | |
<van-cell | |
v-for="item in resourceStore.shareInfo.list" | |
:key="item.fileId" | |
class="resource-item" | |
:border="false" | |
center | |
@click="handleItemClick(item.fileId)" | |
> | |
<template #title> | |
<div class="resource-item__content"> | |
<van-icon name="folder-o" class="content__icon" /> | |
<div class="content__info"> | |
<span class="info__name">{{ item.fileName }}</span> | |
<span v-if="item.fileSize" class="info__size"> | |
{{ formattedFileSize(item.fileSize) }} | |
</span> | |
</div> | |
</div> | |
</template> | |
<template #right-icon> | |
<van-checkbox | |
:name="item.fileId" | |
class="resource-item__checkbox" | |
@click.stop="handleItemClick(item.fileId)" | |
/> | |
</template> | |
</van-cell> | |
</van-cell-group> | |
</van-checkbox-group> | |
<!-- 空状态 --> | |
<van-empty v-if="!resourceStore.shareInfo.list?.length" description="暂无可选资源" /> | |
</div> | |
</template> | |
<script setup lang="ts"> | |
import { ref, watch } from "vue"; | |
import { useResourceStore } from "@/stores/resource"; | |
import { formattedFileSize } from "@/utils/index"; | |
const resourceStore = useResourceStore(); | |
const selectedResourceIds = ref<string[]>([]); | |
// 初始化选中状态 | |
selectedResourceIds.value = resourceStore.resourceSelect | |
.filter((x) => x.isChecked) | |
.map((x) => x.fileId); | |
// 监听选中状态变化 | |
watch(selectedResourceIds, (newIds) => { | |
const newResourceSelect = [...resourceStore.resourceSelect]; | |
newResourceSelect.forEach((x) => { | |
x.isChecked = newIds.includes(x.fileId); | |
}); | |
resourceStore.setSelectedResource(newResourceSelect); | |
}); | |
// 添加点击处理函数 | |
const handleItemClick = (fileId: string) => { | |
const index = selectedResourceIds.value.indexOf(fileId); | |
if (index === -1) { | |
selectedResourceIds.value.push(fileId); | |
} else { | |
selectedResourceIds.value.splice(index, 1); | |
} | |
}; | |
</script> | |
<style lang="scss" scoped> | |
// 工具类 | |
@mixin text-ellipsis { | |
overflow: hidden; | |
text-overflow: ellipsis; | |
white-space: nowrap; | |
} | |
.resource-select { | |
height: 100%; | |
background: var(--theme-other_background); | |
width: 100%; | |
overflow-x: hidden; | |
.resource-item { | |
position: relative; | |
&__content { | |
display: flex; | |
align-items: flex-start; | |
gap: 8px; | |
padding: 8px 0; | |
margin-right: 40px; | |
.content__icon { | |
flex-shrink: 0; | |
font-size: 20px; | |
color: var(--theme-theme); | |
margin-top: 2px; | |
} | |
.content__info { | |
flex: 1; | |
min-width: 0; | |
display: flex; | |
flex-direction: column; | |
gap: 2px; | |
.info__name { | |
font-size: 15px; | |
line-height: 1.4; | |
color: var(--van-text-color); | |
word-break: break-all; | |
white-space: normal; | |
display: -webkit-box; | |
-webkit-line-clamp: 2; | |
-webkit-box-orient: vertical; | |
overflow: hidden; | |
} | |
.info__size { | |
font-size: 13px; | |
color: var(--van-gray-6); | |
@include text-ellipsis; | |
} | |
} | |
} | |
&__checkbox { | |
position: absolute; | |
right: 16px; | |
top: 50%; | |
transform: translateY(-50%); | |
:deep(.van-checkbox__icon) { | |
font-size: 18px; | |
cursor: pointer; | |
.van-icon { | |
border-radius: 2px; | |
transition: all 0.2s; | |
} | |
} | |
} | |
&:active { | |
background-color: var(--van-active-color); | |
} | |
} | |
} | |
// 深度修改 Vant 组件样式 | |
:deep(.van-cell) { | |
align-items: flex-start; | |
padding: 0 16px; | |
width: 100%; | |
box-sizing: border-box; | |
min-height: 60px; | |
position: relative; | |
&::after { | |
display: none; | |
} | |
.van-cell__title { | |
flex: 1; | |
min-width: 0; | |
} | |
} | |
:deep(.van-checkbox__icon--checked) { | |
.van-icon { | |
background-color: var(--theme-theme); | |
border-color: var(--theme-theme); | |
} | |
} | |
:deep(.van-empty) { | |
padding: 32px 0; | |
background: transparent; | |
} | |
</style> | |