diff --git a/components/upload/UploadList/ListItem.tsx b/components/upload/UploadList/ListItem.tsx
index b61b5fc47a..03b564f907 100644
--- a/components/upload/UploadList/ListItem.tsx
+++ b/components/upload/UploadList/ListItem.tsx
@@ -272,7 +272,13 @@ const ListItem = React.forwardRef(
return (
- {itemRender ? itemRender(item, file, items) : item}
+ {itemRender
+ ? itemRender(item, file, items, {
+ download: onDownload.bind(null, file),
+ preview: onPreview.bind(null, file),
+ remove: onClose.bind(null, file),
+ })
+ : item}
);
},
diff --git a/components/upload/UploadList/index.tsx b/components/upload/UploadList/index.tsx
index 73d7fbfc23..d05ed2a6c5 100644
--- a/components/upload/UploadList/index.tsx
+++ b/components/upload/UploadList/index.tsx
@@ -80,11 +80,11 @@ const InternalUploadList: React.ForwardRefRenderFunction) => {
+ const onInternalPreview = (file: UploadFile, e?: React.SyntheticEvent) => {
if (!onPreview) {
return;
}
- e.preventDefault();
+ e?.preventDefault();
return onPreview(file);
};
diff --git a/components/upload/__tests__/__snapshots__/uploadlist.test.js.snap b/components/upload/__tests__/__snapshots__/uploadlist.test.js.snap
index 60d50daf13..407303977e 100644
--- a/components/upload/__tests__/__snapshots__/uploadlist.test.js.snap
+++ b/components/upload/__tests__/__snapshots__/uploadlist.test.js.snap
@@ -114,20 +114,54 @@ exports[`Upload List itemRender 1`] = `
-
- uid:-1 name: xxx.png status: removed url: https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png 1/2
-
+
+ uid:-1 name: xxx.png status: removed url: https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png 1/2
+
+
+ remove
+
+
+ download
+
+
+ preview
+
+
-
- uid:-2 name: yyy.png status: removed url: https://zos.alipayobjects.com/rmsportal/IQKRngzUuFzJzGzRJXUs.png 2/2
-
+
+ uid:-2 name: yyy.png status: removed url: https://zos.alipayobjects.com/rmsportal/IQKRngzUuFzJzGzRJXUs.png 2/2
+
+
+ remove
+
+
+ download
+
+
+ preview
+
+
`;
diff --git a/components/upload/__tests__/type.test.tsx b/components/upload/__tests__/type.test.tsx
index 6195db9d04..f4b987309c 100644
--- a/components/upload/__tests__/type.test.tsx
+++ b/components/upload/__tests__/type.test.tsx
@@ -100,7 +100,24 @@ describe('Upload.typescript', () => {
},
];
const upload = (
-
+
+ )
+ expect(upload).toBeTruthy();
+ });
+ it('itemRender', () => {
+ const upload = (
+ (
+
+ {node}
+ {file.name}
+ {list.length}
+ remove
+ download
+ preview
+
+ )}
+ >
click to upload
);
diff --git a/components/upload/__tests__/uploadlist.test.js b/components/upload/__tests__/uploadlist.test.js
index 201e97903c..68fbab36ce 100644
--- a/components/upload/__tests__/uploadlist.test.js
+++ b/components/upload/__tests__/uploadlist.test.js
@@ -1162,20 +1162,52 @@ describe('Upload List', () => {
});
it('itemRender', () => {
- const itemRender = (originNode, file, currFileList) => {
+ const onDownload = jest.fn();
+ const onRemove = jest.fn();
+ const onPreview = jest.fn();
+ const itemRender = (originNode, file, currFileList, actions) => {
const { name, status, uid, url } = file;
const index = currFileList.indexOf(file);
return (
-
- {`uid:${uid} name: ${name} status: ${status} url: ${url} ${index + 1}/${
- currFileList.length
- }`}
-
+
+
+ {`uid:${uid} name: ${name} status: ${status} url: ${url} ${index + 1}/${
+ currFileList.length
+ }`}
+
+
+ remove
+
+
+ download
+
+
+ preview
+
+
);
};
- const wrapper = mount();
+ const wrapper = mount(
+ ,
+ );
expect(wrapper.render()).toMatchSnapshot();
+ wrapper.find('.custom-item-render-action-remove').first().simulate('click');
+ expect(onRemove.mock.calls[0][0]).toEqual(fileList[0]);
+
+ wrapper.find('.custom-item-render-action-download').first().simulate('click');
+ expect(onDownload.mock.calls[0][0]).toEqual(fileList[0]);
+
+ wrapper.find('.custom-item-render-action-preview').first().simulate('click');
+ expect(onPreview.mock.calls[0][0]).toEqual(fileList[0]);
+
wrapper.unmount();
});
diff --git a/components/upload/index.en-US.md b/components/upload/index.en-US.md
index 04822782aa..dc11e7422b 100644
--- a/components/upload/index.en-US.md
+++ b/components/upload/index.en-US.md
@@ -31,7 +31,7 @@ Uploading is the process of publishing information (web pages, text, pictures, v
| headers | Set request headers, valid above IE10 | object | - | |
| iconRender | Custom show icon | (file: UploadFile, listType?: UploadListType) => ReactNode | - | |
| isImageUrl | Customize if render <img /> in thumbnail | (file: UploadFile) => boolean | [(inside implementation)](https://github.com/ant-design/ant-design/blob/4ad5830eecfb87471cd8ac588c5d992862b70770/components/upload/utils.tsx#L47-L68) | |
-| itemRender | Custom item of uploadList | (originNode: ReactElement, file: UploadFile, fileList?: object\[]) => React.ReactNode | - | 4.7.0 |
+| itemRender | Custom item of uploadList | (originNode: ReactElement, file: UploadFile, fileList: object\[], actions: { download: function, preview: function, remove: function }) => React.ReactNode | - | 4.16.0 |
| listType | Built-in stylesheets, support for three types: `text`, `picture` or `picture-card` | string | `text` | |
| maxCount | Limit the number of uploaded files. Will replace current one when `maxCount` is `1` | number | - | 4.10.0 |
| method | The http method of upload request | string | `post` | |
diff --git a/components/upload/index.zh-CN.md b/components/upload/index.zh-CN.md
index 6aa0fc71fe..7a47c48e62 100644
--- a/components/upload/index.zh-CN.md
+++ b/components/upload/index.zh-CN.md
@@ -32,7 +32,7 @@ cover: https://gw.alipayobjects.com/zos/alicdn/QaeBt_ZMg/Upload.svg
| headers | 设置上传的请求头部,IE10 以上有效 | object | - | |
| iconRender | 自定义显示 icon | (file: UploadFile, listType?: UploadListType) => ReactNode | - | |
| isImageUrl | 自定义缩略图是否使用 <img /> 标签进行显示 | (file: UploadFile) => boolean | [(内部实现)](https://github.com/ant-design/ant-design/blob/4ad5830eecfb87471cd8ac588c5d992862b70770/components/upload/utils.tsx#L47-L68) | |
-| itemRender | 自定义上传列表项 | (originNode: ReactElement, file: UploadFile, fileList?: object\[]) => React.ReactNode | - | 4.7.0 |
+| itemRender | 自定义上传列表项 | (originNode: ReactElement, file: UploadFile, fileList: object\[], actions: { download: function, preview: function, remove: function }) => React.ReactNode | - | 4.16.0 |
| listType | 上传列表的内建样式,支持三种基本样式 `text`, `picture` 和 `picture-card` | string | `text` | |
| maxCount | 限制上传数量。当为 1 时,始终用最新上传的文件代替当前文件 | number | - | 4.10.0 |
| method | 上传请求的 http method | string | `post` | |
diff --git a/components/upload/interface.tsx b/components/upload/interface.tsx
index 43e61b165c..2aa11ae9e8 100755
--- a/components/upload/interface.tsx
+++ b/components/upload/interface.tsx
@@ -69,7 +69,12 @@ export type UploadListProgressProps = Omit;
export type ItemRender = (
originNode: React.ReactElement,
file: UploadFile,
- fileList?: Array>,
+ fileList: Array>,
+ actions: {
+ download: () => void;
+ preview: () => void;
+ remove: () => void;
+ },
) => React.ReactNode;
type PreviewFileHandler = (file: File | Blob) => PromiseLike;