1
1
<template >
2
2
<div class =" upload-box" >
3
3
<el-upload
4
+ v-model:file-list =" fileList"
5
+ :accept =" fileType.join(',')"
4
6
:action =" updateUrl"
5
- list-type = " picture-card "
7
+ :before-upload = " beforeUpload "
6
8
:class =" ['upload', drag ? 'no-border' : '']"
7
- v-model:file-list =" fileList"
8
- :multiple =" true"
9
- :limit =" limit"
9
+ :drag =" drag"
10
10
:headers =" uploadHeaders"
11
- :before-upload =" beforeUpload"
11
+ :limit =" limit"
12
+ :multiple =" true"
13
+ :on-error =" uploadError"
12
14
:on-exceed =" handleExceed"
13
15
:on-success =" uploadSuccess"
14
- :on-error =" uploadError"
15
- :drag =" drag"
16
- :accept =" fileType.join(',')"
16
+ list-type =" picture-card"
17
17
>
18
18
<div class =" upload-empty" >
19
19
<slot name =" empty" >
40
40
</div >
41
41
<el-image-viewer
42
42
v-if =" imgViewVisible"
43
- @close =" imgViewVisible = false"
44
43
:url-list =" [viewImageUrl]"
44
+ @close =" imgViewVisible = false"
45
45
/>
46
46
</div >
47
47
</template >
48
- <script setup lang="ts" name="UploadImgs">
48
+ <script lang="ts" name="UploadImgs" setup >
49
49
import { PropType } from ' vue'
50
+ import type { UploadFile , UploadProps , UploadUserFile } from ' element-plus'
50
51
import { ElNotification } from ' element-plus'
51
- import type { UploadProps , UploadFile , UploadUserFile } from ' element-plus'
52
52
53
53
import { propTypes } from ' @/utils/propTypes'
54
54
import { getAccessToken , getTenantId } from ' @/utils/auth'
@@ -88,8 +88,19 @@ const uploadHeaders = ref({
88
88
' tenant-id' : getTenantId ()
89
89
})
90
90
91
- const fileList = ref <UploadUserFile []>(props .modelValue )
92
-
91
+ const fileList = ref <UploadUserFile []>()
92
+ // fix: 改为动态监听赋值解决图片回显问题
93
+ watch (
94
+ () => props .modelValue ,
95
+ (data ) => {
96
+ if (! data ) return
97
+ fileList .value = data
98
+ },
99
+ {
100
+ deep: true ,
101
+ immediate: true
102
+ }
103
+ )
93
104
/**
94
105
* @description 文件上传之前判断
95
106
* @param rawFile 上传的文件
@@ -116,9 +127,11 @@ const beforeUpload: UploadProps['beforeUpload'] = (rawFile) => {
116
127
interface UploadEmits {
117
128
(e : ' update:modelValue' , value : UploadUserFile []): void
118
129
}
130
+
119
131
const emit = defineEmits <UploadEmits >()
120
132
const uploadSuccess = (response , uploadFile : UploadFile ) => {
121
133
if (! response ) return
134
+ // TODO 多图上传组件成功后只是把保存成功后的url替换掉组件选图时的文件路径,所以返回的fileList包含的是一个包含文件信息的对象列表
122
135
uploadFile .url = response .data
123
136
emit (' update:modelValue' , fileList .value )
124
137
message .success (' 上传成功' )
@@ -159,35 +172,40 @@ const handlePictureCardPreview: UploadProps['onPreview'] = (uploadFile) => {
159
172
}
160
173
</script >
161
174
162
- <style scoped lang="scss">
175
+ <style lang="scss" scoped >
163
176
.is-error {
164
177
.upload {
165
178
:deep (.el-upload--picture-card ),
166
179
:deep (.el-upload-dragger ) {
167
180
border : 1px dashed var (--el-color-danger ) !important ;
181
+
168
182
& :hover {
169
183
border-color : var (--el-color-primary ) !important ;
170
184
}
171
185
}
172
186
}
173
187
}
188
+
174
189
:deep(.disabled ) {
175
190
.el-upload--picture-card ,
176
191
.el-upload-dragger {
177
192
cursor : not-allowed ;
178
193
background : var (--el-disabled-bg-color ) !important ;
179
194
border : 1px dashed var (--el-border-color-darker );
195
+
180
196
& :hover {
181
197
border-color : var (--el-border-color-darker ) !important ;
182
198
}
183
199
}
184
200
}
201
+
185
202
.upload-box {
186
203
.no-border {
187
204
:deep (.el-upload--picture-card ) {
188
205
border : none !important ;
189
206
}
190
207
}
208
+
191
209
:deep(.upload ) {
192
210
.el-upload-dragger {
193
211
display : flex ;
@@ -199,26 +217,31 @@ const handlePictureCardPreview: UploadProps['onPreview'] = (uploadFile) => {
199
217
overflow : hidden ;
200
218
border : 1px dashed var (--el-border-color-darker );
201
219
border-radius : v-bind (borderRadius );
220
+
202
221
& :hover {
203
222
border : 1px dashed var (--el-color-primary );
204
223
}
205
224
}
225
+
206
226
.el-upload-dragger.is-dragover {
207
227
background-color : var (--el-color-primary-light-9 );
208
228
border : 2px dashed var (--el-color-primary ) !important ;
209
229
}
230
+
210
231
.el-upload-list__item ,
211
232
.el-upload--picture-card {
212
233
width : v-bind (width );
213
234
height : v-bind (height );
214
235
background-color : transparent ;
215
236
border-radius : v-bind (borderRadius );
216
237
}
238
+
217
239
.upload-image {
218
240
width : 100% ;
219
241
height : 100% ;
220
242
object-fit : contain ;
221
243
}
244
+
222
245
.upload-handle {
223
246
position : absolute ;
224
247
top : 0 ;
@@ -233,42 +256,49 @@ const handlePictureCardPreview: UploadProps['onPreview'] = (uploadFile) => {
233
256
background : rgb (0 0 0 / 60% );
234
257
opacity : 0 ;
235
258
transition : var (--el-transition-duration-fast );
259
+
236
260
.handle-icon {
237
261
display : flex ;
238
262
flex-direction : column ;
239
263
align-items : center ;
240
264
justify-content : center ;
241
265
padding : 0 6% ;
242
266
color : aliceblue ;
267
+
243
268
.el-icon {
244
269
margin-bottom : 15% ;
245
270
font-size : 140% ;
246
271
}
272
+
247
273
span {
248
274
font-size : 100% ;
249
275
}
250
276
}
251
277
}
278
+
252
279
.el-upload-list__item {
253
280
& :hover {
254
281
.upload-handle {
255
282
opacity : 1 ;
256
283
}
257
284
}
258
285
}
286
+
259
287
.upload-empty {
260
288
display : flex ;
261
289
flex-direction : column ;
262
290
align-items : center ;
263
291
font-size : 12px ;
264
292
line-height : 30px ;
265
293
color : var (--el-color-info );
294
+
266
295
.el-icon {
267
296
font-size : 28px ;
268
297
color : var (--el-text-color-secondary );
269
298
}
270
299
}
271
300
}
301
+
272
302
.el-upload__tip {
273
303
line-height : 15px ;
274
304
text-align : center ;
0 commit comments