fix(components): 修复上传组件回显问题,修改accept参数逻辑

This commit is contained in:
AN
2025-06-11 11:09:34 +08:00
parent 03c8a7f5b7
commit e16a0fa6ed
6 changed files with 63 additions and 29 deletions

View File

@ -1,6 +1,7 @@
<script setup lang="ts">
import { onMounted, ref, useAttrs, watch } from 'vue';
import { ref, useAttrs, watch } from 'vue';
import type { UploadFileInfo } from 'naive-ui';
import { useLoading } from '@sa/hooks';
import { fetchGetOssListByIds } from '@/service/api/system/oss';
import { isNotNull } from '@/utils/common';
import FileUpload from '@/components/custom/file-upload.vue';
@ -13,34 +14,55 @@ const attrs = useAttrs();
const value = defineModel<string>('value', { default: '' });
const { loading, startLoading, endLoading } = useLoading();
const fileList = ref<UploadFileInfo[]>([]);
onMounted(async () => {
fileList.value = [];
const ossIds = value.value.split(',')?.filter(item => isNotNull(item));
if (ossIds.length > 0) {
const { error, data } = await fetchGetOssListByIds(ossIds);
if (error) return;
fileList.value = data.map(item => ({
id: String(item.ossId),
url: item.url,
name: item.originalName,
status: 'finished'
}));
}
});
async function handleFetchOssList(ossIds: string[]) {
startLoading();
const { error, data } = await fetchGetOssListByIds(ossIds);
if (error) return;
fileList.value = data.map(item => ({
id: String(item.ossId),
url: item.url,
name: item.originalName,
status: 'finished'
}));
endLoading();
}
watch(
value,
async val => {
const ossIds = val.split(',')?.filter(item => isNotNull(item));
const fileIds = new Set(fileList.value.filter(item => item.status === 'finished').map(item => item.id));
if (ossIds.every(item => fileIds.has(item))) {
return;
}
if (ossIds.length === 0) {
fileList.value = [];
return;
}
await handleFetchOssList(ossIds);
},
{ immediate: true }
);
watch(
fileList,
val => {
value.value = val.map(item => item.id).join(',');
value.value = val
.filter(item => item.status === 'finished')
.map(item => item.id)
.join(',');
},
{ deep: true }
);
</script>
<template>
<FileUpload v-bind="attrs" v-model:file-list="fileList" />
<NSpin v-if="loading" />
<FileUpload v-else v-bind="attrs" v-model:file-list="fileList" />
</template>
<style scoped></style>