diff --git a/src/components/Upload/src/BasicUpload.vue b/src/components/Upload/src/BasicUpload.vue index f18c647e..fa5eabfd 100644 --- a/src/components/Upload/src/BasicUpload.vue +++ b/src/components/Upload/src/BasicUpload.vue @@ -36,6 +36,7 @@ props.previewColumns, () => { - if (props.previewColumns.length) { + if (Array.isArray(props.previewColumns) && props.previewColumns.length) { columns = props.previewColumns; actionColumn = null; + } else if (isFunction(props.previewColumns)) { + columns = props.previewColumns({ handleRemove, handleAdd }); } else { columns = createPreviewColumns(); actionColumn = createPreviewActionColumn({ handleRemove, handleDownload }); @@ -74,18 +79,29 @@ ); // 删除 - function handleRemove(record: PreviewFileItem) { - const index = fileListRef.value.findIndex((item) => item.url === record.url); + function handleRemove(record: PreviewFileItem | Record, urlKey = 'url') { + const index = fileListRef.value.findIndex((item) => item[urlKey] === record[urlKey]); if (index !== -1) { const removed = fileListRef.value.splice(index, 1); - emit('delete', removed[0].url); + emit('delete', removed[0][urlKey]); emit( 'list-change', - fileListRef.value.map((item) => item.url), + fileListRef.value.map((item) => item[urlKey]), ); } } - + // 添加 + function handleAdd(record: PreviewFileItem | Record, urlKey = 'url') { + const { maxNumber } = props; + if (fileListRef.value.length + fileListRef.value.length > maxNumber) { + return createMessage.warning(t('component.upload.maxNumber', [maxNumber])); + } + fileListRef.value = [...fileListRef.value, record]; + emit( + 'list-change', + fileListRef.value.map((item) => item[urlKey]), + ); + } // 下载 function handleDownload(record: PreviewFileItem) { const { url = '' } = record; diff --git a/src/components/Upload/src/props.ts b/src/components/Upload/src/props.ts index ee2e7d46..704f412a 100644 --- a/src/components/Upload/src/props.ts +++ b/src/components/Upload/src/props.ts @@ -14,11 +14,13 @@ type SortableOptions = Merge< // ...可扩展 } >; - +type previewColumnsFnType = { + handleRemove:(record:Record,key:string)=>any, + handleAdd:(record:Record,key:string)=>any, +} export const previewType = { previewColumns: { - type: Array as PropType, - default: [], + type: [Array,Function] as PropType BasicColumn[])>, required: false, }, beforePreviewData: { @@ -111,6 +113,10 @@ export const previewProps = { type: Array as PropType, default: () => [], }, + maxNumber: { + type: Number as PropType, + default: 1, + }, ...previewType, }; diff --git a/src/views/demo/comp/upload/Upload1.vue b/src/views/demo/comp/upload/Upload1.vue new file mode 100644 index 00000000..efdc7000 --- /dev/null +++ b/src/views/demo/comp/upload/Upload1.vue @@ -0,0 +1,28 @@ + + + + + \ No newline at end of file diff --git a/src/views/demo/comp/upload/Upload2.vue b/src/views/demo/comp/upload/Upload2.vue new file mode 100644 index 00000000..9e76f954 --- /dev/null +++ b/src/views/demo/comp/upload/Upload2.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/views/demo/comp/upload/Upload3.vue b/src/views/demo/comp/upload/Upload3.vue new file mode 100644 index 00000000..c985724d --- /dev/null +++ b/src/views/demo/comp/upload/Upload3.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/src/views/demo/comp/upload/Upload4.vue b/src/views/demo/comp/upload/Upload4.vue new file mode 100644 index 00000000..8dd852f9 --- /dev/null +++ b/src/views/demo/comp/upload/Upload4.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/src/views/demo/comp/upload/index.vue b/src/views/demo/comp/upload/index.vue index d28616f2..e321a2db 100644 --- a/src/views/demo/comp/upload/index.vue +++ b/src/views/demo/comp/upload/index.vue @@ -1,226 +1,15 @@