refactor(Sku): refactor image upload

This commit is contained in:
songweite 2020-07-03 17:48:50 +08:00 committed by neverland
parent 8d29e5c8c6
commit 7343e55409
2 changed files with 26 additions and 138 deletions

View File

@ -2,8 +2,6 @@
import { createNamespace } from '../../utils'; import { createNamespace } from '../../utils';
// Components // Components
import Icon from '../../icon';
import Loading from '../../loading';
import Uploader from '../../uploader'; import Uploader from '../../uploader';
const [createComponent, bem, t] = createNamespace('sku-img-uploader'); const [createComponent, bem, t] = createNamespace('sku-img-uploader');
@ -20,26 +18,32 @@ export default createComponent({
data() { data() {
return { return {
// 正在上传的图片 base64 fileList: [],
paddingImg: '',
uploadFail: false,
}; };
}, },
watch: {
value(val) {
if (val) {
this.fileList = [{ url: val, isImage: true }];
} else {
this.fileList = [];
}
},
},
methods: { methods: {
afterReadFile(file) { afterReadFile(file) {
// 上传文件 file.status = 'uploading';
this.paddingImg = file.content; file.message = '上传中...';
this.uploadFail = false;
this.uploadImg(file.file, file.content) this.uploadImg(file.file, file.content)
.then((img) => { .then((img) => {
file.status = 'done';
this.$emit('input', img); this.$emit('input', img);
this.$nextTick(() => {
this.paddingImg = '';
});
}) })
.catch(() => { .catch(() => {
this.uploadFail = true; file.status = 'failed';
file.message = '上传失败';
}); });
}, },
@ -47,68 +51,21 @@ export default createComponent({
this.$toast(t('oversize', this.maxSize)); this.$toast(t('oversize', this.maxSize));
}, },
genUploader(content, disabled = false) { onDelete() {
return ( this.$emit('input', '');
<Uploader
class={bem('uploader')}
disabled={disabled}
afterRead={this.afterReadFile}
maxSize={this.maxSize * 1024 * 1024}
onOversize={this.onOversize}
>
<div class={bem('img')}>{content}</div>
</Uploader>
);
},
genMask() {
return (
<div class={bem('mask')}>
{this.uploadFail ? (
[
<Icon name="warning-o" size="20px" />,
<div class={bem('warn-text')} domPropsInnerHTML={t('fail')} />,
]
) : (
<Loading type="spinner" size="20px" color="white" />
)}
</div>
);
}, },
}, },
render() { render() {
return ( return (
<div class={bem()}> <Uploader
{this.value && vModel={this.fileList}
this.genUploader( maxCount={1}
[ afterRead={this.afterReadFile}
<img src={this.value} />, maxSize={this.maxSize * 1024 * 1024}
<Icon onOversize={this.onOversize}
name="clear" onDelete={this.onDelete}
class={bem('delete')} />
onClick={() => {
this.$emit('input', '');
}}
/>,
],
true
)}
{this.paddingImg &&
this.genUploader(
[<img src={this.paddingImg} />, this.genMask()],
!this.uploadFail
)}
{!this.value &&
!this.paddingImg &&
this.genUploader(
<div class={bem('trigger')}>
<Icon name="photograph" size="22px" />
</div>
)}
</div>
); );
}, },
}); });

View File

@ -332,7 +332,6 @@
} }
&-label { &-label {
margin-top: @padding-xs;
color: @cell-label-color; color: @cell-label-color;
font-size: @cell-label-font-size; font-size: @cell-label-font-size;
line-height: @cell-label-line-height; line-height: @cell-label-line-height;
@ -340,74 +339,6 @@
} }
} }
&-img-uploader {
display: inline-block;
&__uploader {
vertical-align: middle;
}
&__img {
position: relative;
float: left;
width: 64px;
height: 64px;
margin-right: @padding-xs;
background: @sku-item-background-color;
border-radius: @border-radius-sm;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
}
&__delete {
position: absolute;
top: -12px;
right: -14px;
z-index: 1;
padding: 6px;
color: @sku-upload-mask-color;
opacity: 0.8;
&::before {
background-color: @white;
border-radius: 14px;
}
}
&__mask {
position: absolute;
top: 0;
left: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
color: white;
background: @sku-upload-mask-color;
}
&__warn-text {
margin-top: 6px;
font-size: @font-size-sm;
line-height: 14px;
}
&__trigger {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
color: @sku-icon-gray-color;
}
}
&-actions { &-actions {
display: flex; display: flex;
flex-shrink: 0; flex-shrink: 0;