先上效果和使用方法

<template>
<ImgUploader :fileList="fileList" />
</template>
<script setup>
import ImgUploader from "@/pages/components/ImgUploader.vue";
const fileList = ref([]);
</script>
嘎嘎简便,上源码,注释里有详细说明,更具体的属性请查阅下面的链接
uiadmin.net/uview-plus/…
<template>
<u-upload
:fileList="fileList"
@afterRead="afterRead"
@delete="deletePic"
name="pic"
:previewFullImage="true"
:width="width"
:height="height"
></u-upload>
</template>
<script setup>
import { upload } from "@/apis/systemRequest";
import { useVModel } from "@vueuse/core";
const props = defineProps({
fileList: {
type: Array,
default: () => {
return [];
},
},
width: {
type: Number,
default: 220,
},
height: {
type: Number,
default: 220,
},
});
const emit = defineEmits(["update:fileList"]);
const fileList = useVModel(props, "fileList", emit);
const deletePic = (event) => {
fileList.value.splice(event.index, 1);
};
const afterRead = async (event) => {
let lists = [].concat(event.file);
let fileListLen = fileList.value.length;
lists.map((item) => {
fileList.value.push({
...item,
status: "uploading",
message: "上传中",
});
});
for (let i = 0; i < lists.length; i++) {
try {
const result = await uploadFilePromise(lists[i]);
let item = fileList.value[fileListLen];
fileList.value.splice(fileListLen, 1, {
...item,
status: "success",
message: "",
webUrl: result.data.data.url,
});
fileListLen++;
} catch (error) {}
}
};
async function uploadFilePromise(file) {
let formData = new FormData();
let response = await fetch(file.url);
let blob = await response.blob();
formData.append("file", new File([blob], file.name, { type: file.type }));
try {
const res = await upload(formData);
if (res.data.msg === "success") {
return res;
} else {
uni.showToast({
title: res.data.msg,
icon: "error",
});
}
throw res.data;
} finally {
}
}
</script>
<style lang="scss" scoped>
:deep(.u-upload__button) {
background-color: white;
border: 1px solid rgb(185, 178, 178);
.u-icon__icon {
font-size: 90rpx !important;
}
}
:deep(.u-upload__wrap__preview) {
border: 1px solid rgb(185, 178, 178);
.uicon-close {
font-size: 30rpx !important;
}
}
:deep(.u-upload__wrap) {
padding-left: 8px;
padding-top: 8px;
}
</style>