Skip to content

Commit e1866fd

Browse files
authored
feat(Upload): support single select
close #225
1 parent 8491e6f commit e1866fd

File tree

14 files changed

+279
-19
lines changed

14 files changed

+279
-19
lines changed

src/components/Upload/Upload.jsx

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,27 @@ class Upload extends PureComponent {
126126
/* eslint-enable no-console */
127127
};
128128

129+
/** 单选 */
130+
onSingleSelect = files => {
131+
const { onAdd, onRemove } = this.props;
132+
if (!files.length) return;
133+
134+
let fileList = this.getFileList();
135+
if (fileList.length) {
136+
const file = fileList[0];
137+
if (onRemove(file, 0) === false) {
138+
return;
139+
}
140+
}
141+
142+
fileList = [files[0]];
143+
if (onAdd(fileList) === false) {
144+
return;
145+
}
146+
147+
this.onChange(fileList, () => this.handleFilesUpload(fileList));
148+
return;
149+
};
129150
/** 处理添加文件 */
130151
onAdd = files => {
131152
const { maxCount, onAdd } = this.props;
@@ -216,7 +237,7 @@ class Upload extends PureComponent {
216237
return (
217238
<div {...rest}>
218239
<Selector
219-
onSelect={this.onAdd}
240+
onSelect={multiple ? this.onAdd : this.onSingleSelect}
220241
onError={this.onError}
221242
disabled={disabled}
222243
multiple={multiple}

src/components/Upload/Upload.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
* 传入其它原生的 props 会自动附加到最外层的 div 上,如 style、className 等
44
* 是否受控由一开始是否传入 fileList 决定,如果想要受控但是一开始未传入可能会导致逻辑性的错误。受控情况下需要自行处理所有数据。
55
* 选择文件的事件触发顺序为 打开文件选择框 - 选择文件 - 检查文件类型(有错误会中断,触发 onError) - 检查文件大小(有错误会中断,触发 onError) - 调用 onAdd(没有则跳过,返回 false 则中断) - 检查文件数量(有错误会中断,触发 onError) - 更新文件列表并触发 onChange - 有 handleUpload 时开始更新文件 status 为 uploading 并开始上传文件,触发 onChange - 文件上传成功或失败时更新文件 status 并触发 onChange
6+
* 单选时选中文件将会直接将已有文件替换
7+
* 为单选时在调用 onAdd 之前如已存在选择文件将会先调用 onRemove 检查可否移除已有文件,然后调用 onAdd,并不会触发文件数量错误
68

79
### 演示
810

@@ -21,6 +23,11 @@
2123
```js {"codepath": "multiple.jsx"}
2224
```
2325

26+
* 支持单选
27+
28+
```js {"codepath": "single.jsx"}
29+
```
30+
2431
* 限制文件数量
2532

2633
```js {"codepath": "maxCount.jsx"}

src/components/Upload/__demo__/accept.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const Demo = () => (
77
onChange={fileList => console.log(fileList)}
88
onError={({ message, name }) => alert(`there is an error of ${name}: ${message}`)}
99
accept="image/* , .pdf"
10+
multiple
1011
/>
1112
);
1213
// demo end

src/components/Upload/__demo__/base.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const Demo = () => (
66
<Upload
77
onChange={fileList => console.log(fileList)}
88
onError={({ message, name }) => alert(`there is an error of ${name}: ${message}`)}
9+
multiple
910
/>
1011
);
1112
// demo end

src/components/Upload/__demo__/controlled.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class Demo extends React.Component {
4242
);
4343
}
4444
}}
45+
multiple
4546
onError={({ message, name }) => alert(`there is an error of ${name}: ${message}`)}
4647
fileList={state.fileList}
4748
/>

src/components/Upload/__demo__/disabled.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const Demo = () => (
77
onChange={fileList => console.log(fileList)}
88
onError={({ message, name }) => alert(`there is an error of ${name}: ${message}`)}
99
disabled
10+
multiple
1011
/>
1112
);
1213
// demo end

src/components/Upload/__demo__/listType.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const Demo = () => (
77
onChange={fileList => console.log(fileList)}
88
onError={({ message, name }) => alert(`there is an error of ${name}: ${message}`)}
99
listType="none"
10+
multiple
1011
/>
1112
);
1213
// demo end

src/components/Upload/__demo__/maxSize.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const Demo = () => (
77
onChange={fileList => console.log(fileList)}
88
onError={({ message, name }) => alert(`there is an error of ${name}: ${message}`)}
99
maxSize={1024 * 1024}
10+
multiple
1011
/>
1112
);
1213
// demo end

src/components/Upload/__demo__/readFile.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const Demo = () => (
1919
onChange={fileList => console.log(fileList)}
2020
onAdd={handleOnAdd}
2121
onError={({ message, name }) => alert(`there is an error of ${name}: ${message}`)}
22+
multiple
2223
/>
2324
);
2425
// demo end

src/components/Upload/__demo__/selector.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const Demo = () => (
88
onChange={fileList => console.log(fileList)}
99
onError={({ message, name }) => alert(`there is an error of ${name}: ${message}`)}
1010
selector={<button>点我点我选</button>}
11+
multiple
1112
/>
1213
</div>
1314
);

0 commit comments

Comments
 (0)