3
3
<el-upload
4
4
v-model:file-list="fileList"
5
5
list-type="picture-card"
6
+ :class="
7
+ fileList.length >= props.limit || !props.showUploadBtn ? 'hide' : 'show'
8
+ "
6
9
:before-upload="handleBeforeUpload"
7
10
:http-request="handleUpload"
8
11
:on-remove="handleRemove"
9
- :on-preview="previewImg "
12
+ :accept="props.accept "
10
13
:limit="props.limit"
11
14
>
12
15
<i-ep-plus />
16
+ <template #file="{ file }">
17
+ <div>
18
+ <img class="el-upload-list__item-thumbnail" :src="file.url" alt="" />
19
+ <span class="el-upload-list__item-actions">
20
+ <span class="el-upload-list__item-preview" @click="previewImg(file)">
21
+ <el-icon><zoom-in /></el-icon>
22
+ </span>
23
+ <span
24
+ v-if="props.showDelBtn"
25
+ class="el-upload-list__item-delete"
26
+ @click="handleRemove(file)"
27
+ >
28
+ <el-icon><Delete /></el-icon>
29
+ </span>
30
+ </span>
31
+ </div>
32
+ </template>
13
33
</el-upload>
14
34
15
- <el-dialog v-model="dialogVisible">
16
- <img w-full :src="previewImgUrl" alt="Preview Image" />
17
- </el-dialog>
35
+ <el-image-viewer
36
+ v-if="viewVisible"
37
+ :zoom-rate="1.2"
38
+ @close="closePreview"
39
+ :initialIndex="initialIndex"
40
+ :url-list="viewFileList"
41
+ />
18
42
</template>
19
-
20
43
<script setup lang="ts">
21
44
import {
22
45
UploadRawFile,
@@ -44,12 +67,42 @@ const props = defineProps({
44
67
type: Number,
45
68
default: 10,
46
69
},
70
+ /**
71
+ * 是否显示删除按钮
72
+ */
73
+ showDelBtn: {
74
+ type: Boolean,
75
+ default: true,
76
+ },
77
+ /**
78
+ * 是否显示上传按钮
79
+ */
80
+ showUploadBtn: {
81
+ type: Boolean,
82
+ default: true,
83
+ },
84
+ /**
85
+ * 单张图片最大大小
86
+ */
87
+ uploadMaxSize: {
88
+ type: Number,
89
+ default: 2 * 1024 * 1024,
90
+ },
91
+ /**
92
+ * 上传文件类型
93
+ */
94
+ accept: {
95
+ type: String,
96
+ default: "image/*",
97
+ },
47
98
});
48
99
49
- const previewImgUrl = ref("" );
50
- const dialogVisible = ref(false );
100
+ const viewVisible = ref(false );
101
+ const initialIndex = ref(0 );
51
102
52
103
const fileList = ref([] as UploadUserFile[]);
104
+ const viewFileList = ref([] as string[]);
105
+
53
106
watch(
54
107
() => props.modelValue,
55
108
(newVal: string[]) => {
@@ -79,7 +132,7 @@ watch(
79
132
/**
80
133
* 自定义图片上传
81
134
*
82
- * @param params
135
+ * @param options
83
136
*/
84
137
async function handleUpload(options: UploadRequestOptions): Promise<any> {
85
138
// 上传API调用
@@ -89,12 +142,10 @@ async function handleUpload(options: UploadRequestOptions): Promise<any> {
89
142
const fileIndex = fileList.value.findIndex(
90
143
(file) => file.uid == (options.file as any).uid
91
144
);
92
-
93
145
fileList.value.splice(fileIndex, 1, {
94
146
name: data.name,
95
147
url: data.url,
96
148
} as UploadUserFile);
97
-
98
149
emit(
99
150
"update:modelValue",
100
151
fileList.value.map((file) => file.url)
@@ -122,8 +173,10 @@ function handleRemove(removeFile: UploadFile) {
122
173
* 限制用户上传文件的格式和大小
123
174
*/
124
175
function handleBeforeUpload(file: UploadRawFile) {
125
- if (file.size > 2 * 1048 * 1048) {
126
- ElMessage.warning("上传图片不能大于2M");
176
+ if (file.size > props.uploadMaxSize) {
177
+ ElMessage.warning(
178
+ "上传图片不能大于" + props.uploadMaxSize / 1024 / 1024 + "M"
179
+ );
127
180
return false;
128
181
}
129
182
return true;
@@ -132,8 +185,31 @@ function handleBeforeUpload(file: UploadRawFile) {
132
185
/**
133
186
* 预览图片
134
187
*/
135
- const previewImg: UploadProps["onPreview"] = (uploadFile) => {
136
- previewImgUrl.value = uploadFile.url!;
137
- dialogVisible.value = true;
188
+ const previewImg: UploadProps["onPreview"] = (uploadFile: UploadFile) => {
189
+ viewFileList.value = fileList.value.map((file) => file.url!);
190
+ initialIndex.value = fileList.value.findIndex(
191
+ (file) => file.url === uploadFile.url
192
+ );
193
+ viewVisible.value = true;
194
+ };
195
+
196
+ /**
197
+ * 关闭预览
198
+ */
199
+ const closePreview = () => {
200
+ viewVisible.value = false;
138
201
};
139
202
</script>
203
+ <style lang="scss" scoped>
204
+ .hide {
205
+ :deep(.el-upload--picture-card) {
206
+ display: none;
207
+ }
208
+ }
209
+
210
+ .show {
211
+ :deep(.el-upload--picture-card) {
212
+ display: flex;
213
+ }
214
+ }
215
+ </style>
0 commit comments