feat(Uploader): support uploading status (#5625)

This commit is contained in:
neverland 2020-02-05 15:32:00 +08:00 committed by GitHub
parent 26cf84faf0
commit 1039db5496
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 113 additions and 31 deletions

View File

@ -785,8 +785,10 @@
@uploader-mask-icon-size: 22px; @uploader-mask-icon-size: 22px;
@uploader-mask-message-font-size: @font-size-sm; @uploader-mask-message-font-size: @font-size-sm;
@uploader-mask-message-line-height: 14px; @uploader-mask-message-line-height: 14px;
@uploader-loading-icon-size: 22px;
@uploader-loading-icon-color: @white;
// Sku // Sku
@sku-item-background-color: @background-color; @sku-item-background-color: @background-color;
@sku-icon-gray-color: #dcdde0; @sku-icon-gray-color: @gray-4;
@sku-upload-mask-color: rgba(50, 50, 51, 0.8); @sku-upload-mask-color: rgba(50, 50, 51, 0.8);

View File

@ -45,7 +45,7 @@ export default {
}; };
``` ```
### Failed ### Upload Status
```html ```html
<van-uploader v-model="fileList" :after-read="afterRead" /> <van-uploader v-model="fileList" :after-read="afterRead" />
@ -55,13 +55,29 @@ export default {
export default { export default {
data() { data() {
return { return {
fileList: [] fileList: [
{
url: 'https://img.yzcdn.cn/vant/leaf.jpg',
status: 'uploading',
message: 'Uploading...'
},
{
url: 'https://img.yzcdn.cn/vant/tree.jpg',
status: 'failed',
message: 'Failed'
}
]
} }
}, },
methods: { methods: {
afterRead(file) { afterRead(file) {
file.status = 'failed'; file.status = 'uploading';
file.message = 'Failed'; file.message = 'Uploading...';
setTimeout(() => {
file.status = 'failed';
file.message = 'Failed';
}, 1000);
} }
} }
}; };

View File

@ -53,9 +53,9 @@ export default {
}; };
``` ```
### 上传失败 ### 上传状态
将 file 的`status`设置为`failed`表示文件上传失败 通过`status`属性可以标识上传状态,`uploading`表示上传中,`failed`表示上传失败,`done`表示上传完成(从 2.4.7 版本开始支持)
```html ```html
<van-uploader v-model="fileList" :after-read="afterRead" /> <van-uploader v-model="fileList" :after-read="afterRead" />
@ -65,13 +65,29 @@ export default {
export default { export default {
data() { data() {
return { return {
fileList: [] fileList: [
{
url: 'https://img.yzcdn.cn/vant/leaf.jpg',
status: 'uploading',
message: '上传中...'
},
{
url: 'https://img.yzcdn.cn/vant/tree.jpg',
status: 'failed',
message: '上传失败'
}
]
} }
}, },
methods: { methods: {
afterRead(file) { afterRead(file) {
file.status = 'failed'; file.status = 'uploading';
file.message = '上传失败'; file.message = '上传中...';
setTimeout(() => {
file.status = 'failed';
file.message = '上传失败';
}, 1000);
} }
} }
}; };

View File

@ -8,8 +8,8 @@
<van-uploader v-model="fileList" multiple accept="*" /> <van-uploader v-model="fileList" multiple accept="*" />
</demo-block> </demo-block>
<demo-block v-if="!isWeapp" :title="$t('failed')"> <demo-block v-if="!isWeapp" :title="$t('status')">
<van-uploader v-model="failedFileList" :after-read="afterReadFailed" /> <van-uploader v-model="statusFileList" :after-read="afterReadFailed" />
</demo-block> </demo-block>
<demo-block :title="$t('maxCount')"> <demo-block :title="$t('maxCount')">
@ -34,19 +34,23 @@
export default { export default {
i18n: { i18n: {
'zh-CN': { 'zh-CN': {
status: '上传状态',
failed: '上传失败', failed: '上传失败',
upload: '上传文件', upload: '上传文件',
preview: '文件预览', preview: '文件预览',
maxCount: '限制上传数量', maxCount: '限制上传数量',
uploading: '上传中...',
beforeRead: '上传前校验', beforeRead: '上传前校验',
uploadStyle: '自定义上传样式', uploadStyle: '自定义上传样式',
invalidType: '请上传 jpg 格式图片', invalidType: '请上传 jpg 格式图片',
}, },
'en-US': { 'en-US': {
status: 'Upload Status',
failed: 'Failed', failed: 'Failed',
upload: 'Upload File', upload: 'Upload File',
preview: 'Preview File', preview: 'Preview File',
maxCount: 'Max Count', maxCount: 'Max Count',
uploading: 'Uploading...',
beforeRead: 'Before Read', beforeRead: 'Before Read',
uploadStyle: 'Upload Style', uploadStyle: 'Upload Style',
invalidType: 'Please upload an image in jpg format', invalidType: 'Please upload an image in jpg format',
@ -61,16 +65,23 @@ export default {
], ],
fileList2: [{ url: 'https://img.yzcdn.cn/vant/sand.jpg' }], fileList2: [{ url: 'https://img.yzcdn.cn/vant/sand.jpg' }],
fileList3: [], fileList3: [],
failedFileList: [], statusFileList: [],
}; };
}, },
created() { created() {
this.failedFileList.push({ this.statusFileList.push(
url: 'https://img.yzcdn.cn/vant/leaf.jpg', {
status: 'failed', url: 'https://img.yzcdn.cn/vant/leaf.jpg',
message: this.$t('failed'), status: 'uploading',
}); message: this.$t('uploading'),
},
{
url: 'https://img.yzcdn.cn/vant/tree.jpg',
status: 'failed',
message: this.$t('failed'),
}
);
}, },
methods: { methods: {
@ -88,8 +99,13 @@ export default {
}, },
afterReadFailed(item) { afterReadFailed(item) {
item.status = 'failed'; item.status = 'uploading';
item.message = this.$t('failed'); item.message = this.$t('uploading');
setTimeout(() => {
item.status = 'failed';
item.message = this.$t('failed');
}, 1000);
}, },
}, },
}; };

View File

@ -5,6 +5,7 @@ import { toArray, readFile, isOversize, isImageFile } from './utils';
// Components // Components
import Icon from '../icon'; import Icon from '../icon';
import Image from '../image'; import Image from '../image';
import Loading from '../loading';
import ImagePreview from '../image-preview'; import ImagePreview from '../image-preview';
const [createComponent, bem] = createNamespace('uploader'); const [createComponent, bem] = createNamespace('uploader');
@ -224,8 +225,32 @@ export default createComponent({
} }
}, },
genPreviewMask(item) {
const { status } = item;
if (status === 'uploading' || status === 'failed') {
const MaskIcon =
status === 'failed' ? (
<Icon name="warning-o" class={bem('mask-icon')} />
) : (
<Loading class={bem('loading')} />
);
return (
<div class={bem('mask')}>
{MaskIcon}
{item.message && (
<div class={bem('mask-message')}>{item.message}</div>
)}
</div>
);
}
},
genPreviewItem(item, index) { genPreviewItem(item, index) {
const DeleteIcon = this.deletable && ( const showDelete = item.status !== 'uploading' && this.deletable;
const DeleteIcon = showDelete && (
<Icon <Icon
name="clear" name="clear"
class={bem('preview-delete')} class={bem('preview-delete')}
@ -263,15 +288,6 @@ export default createComponent({
</div> </div>
); );
const Mask = item.status === 'failed' && (
<div class={bem('mask')}>
<Icon name="warning-o" class={bem('mask-icon')} />
{item.message && (
<div class={bem('mask-message')}>{item.message}</div>
)}
</div>
);
return ( return (
<div <div
class={bem('preview')} class={bem('preview')}
@ -280,7 +296,7 @@ export default createComponent({
}} }}
> >
{Preview} {Preview}
{Mask} {this.genPreviewMask(item)}
{DeleteIcon} {DeleteIcon}
</div> </div>
); );

View File

@ -102,6 +102,12 @@
} }
} }
&__loading {
width: @uploader-loading-icon-size;
height: @uploader-loading-icon-size;
color: @uploader-loading-icon-color;
}
&__file { &__file {
display: flex; display: flex;
flex-direction: column; flex-direction: column;

View File

@ -40,6 +40,16 @@ exports[`renders demo correctly 1`] = `
<div class="van-image__loading"><i class="van-icon van-icon-photo-o van-image__loading-icon"> <div class="van-image__loading"><i class="van-icon van-icon-photo-o van-image__loading-icon">
<!----></i></div> <!----></i></div>
</div> </div>
<div class="van-uploader__mask">
<div class="van-loading van-loading--circular van-uploader__loading"><span class="van-loading__spinner van-loading__spinner--circular"><svg viewBox="25 25 50 50" class="van-loading__circular"><circle cx="50" cy="50" r="20" fill="none"></circle></svg></span></div>
<div class="van-uploader__mask-message">上传中...</div>
</div>
</div>
<div class="van-uploader__preview">
<div class="van-image van-uploader__preview-image" style="overflow: hidden; border-radius: 4px;"><img src="https://img.yzcdn.cn/vant/tree.jpg" class="van-image__img" style="object-fit: cover;">
<div class="van-image__loading"><i class="van-icon van-icon-photo-o van-image__loading-icon">
<!----></i></div>
</div>
<div class="van-uploader__mask"><i class="van-icon van-icon-warning-o van-uploader__mask-icon"> <div class="van-uploader__mask"><i class="van-icon van-icon-warning-o van-uploader__mask-icon">
<!----></i> <!----></i>
<div class="van-uploader__mask-message">上传失败</div> <div class="van-uploader__mask-message">上传失败</div>