import { use } from '../utils'; import Icon from '../icon'; import Image from '../image'; const [sfc, bem] = use('uploader'); export default sfc({ inheritAttrs: false, props: { preview: Boolean, disabled: Boolean, uploadText: String, beforeRead: Function, afterRead: Function, accept: { type: String, default: 'image/*' }, resultType: { type: String, default: 'dataUrl' }, maxSize: { type: Number, default: Number.MAX_VALUE }, maxCount: { type: Number, default: Number.MAX_VALUE } }, data() { return { previewImages: [] }; }, computed: { detail() { return { name: this.$attrs.name || '' }; } }, methods: { onChange(event) { let { files } = event.target; if (this.disabled || !files.length) { return; } files = files.length === 1 ? files[0] : [].slice.call(files, 0); if (!files || (this.beforeRead && !this.beforeRead(files, this.detail))) { this.resetInput(); return; } if (Array.isArray(files)) { const maxCount = this.maxCount - this.previewImages.length; files = files.slice(0, maxCount); Promise.all(files.map(this.readFile)).then(contents => { let oversize = false; const payload = files.map((file, index) => { if (file.size > this.maxSize) { oversize = true; } return { file: files[index], content: contents[index] }; }); this.onAfterRead(payload, oversize); }); } else { this.readFile(files).then(content => { this.onAfterRead({ file: files, content }, files.size > this.maxSize); }); } }, readFile(file) { return new Promise(resolve => { const reader = new FileReader(); reader.onload = event => { resolve(event.target.result); }; if (this.resultType === 'dataUrl') { reader.readAsDataURL(file); } else if (this.resultType === 'text') { reader.readAsText(file); } }); }, onAfterRead(files, oversize) { if (oversize) { this.$emit('oversize', files, this.detail); return; } if (Array.isArray(files)) { files.forEach(this.addPreviewImage); } else { this.addPreviewImage(files); } if (this.afterRead) { this.afterRead(files, this.detail); } this.resetInput(); }, addPreviewImage(file) { this.previewImages.push(file.content); }, resetInput() { /* istanbul ignore else */ if (this.$refs.input) { this.$refs.input.value = ''; } }, renderPreview() { if (this.preview) { return this.previewImages.map(image => ( )); } }, renderUpload() { if (this.previewImages.length >= this.maxCount) { return; } const slot = this.slots(); const Input = ( ); if (slot) { return (
{slot} {Input}
); } return (
{this.uploadText && {this.uploadText}} {Input}
); } }, render(h) { return (
{this.renderPreview()} {this.renderUpload()}
); } });