diff --git a/components.json b/components.json index 314321185..cc119630b 100644 --- a/components.json +++ b/components.json @@ -46,6 +46,7 @@ "row": "./packages/row/index.js", "col": "./packages/col/index.js", "upload": "./packages/upload/index.js", + "upload-dragger": "./packages/upload/index.js", "progress": "./packages/progress/index.js", "spinner": "./packages/spinner/index.js", "message": "./packages/message/index.js", diff --git a/examples/docs/zh-CN/upload.md b/examples/docs/zh-CN/upload.md index c81cc4220..423378321 100644 --- a/examples/docs/zh-CN/upload.md +++ b/examples/docs/zh-CN/upload.md @@ -12,7 +12,15 @@ export default { data() { return { - fileList: [{name: 'food.jpeg', url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'}, {name: 'food2.jpeg', url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'}] + fileList: [{ + name: 'food.jpeg', + url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100', + status: 'finished' + }, { + name: 'food2.jpeg', + url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100', + status: 'finished' + }] }; }, methods: { @@ -78,7 +86,20 @@ ``` ::: -### 拖拽上传 +::: demo 通过 slot 你可以传入自定义的上传按钮类型和文字提示。 +```html + + 点击上传 +
只能上传jpg/png文件,且不超过500kb
+
+``` +::: + + ### Attribute | 参数 | 说明 | 类型 | 可选值 | 默认值 | diff --git a/packages/upload-dragger/index.js b/packages/upload-dragger/index.js new file mode 100644 index 000000000..0774ec7d4 --- /dev/null +++ b/packages/upload-dragger/index.js @@ -0,0 +1,8 @@ +import UploadDragger from '../upload/src/upload-dragger'; + +/* istanbul ignore next */ +UploadDragger.install = function(Vue) { + Vue.component(UploadDragger.name, UploadDragger); +}; + +export default UploadDragger; diff --git a/packages/upload/_index.js b/packages/upload/_index.js new file mode 100644 index 000000000..45ae291fe --- /dev/null +++ b/packages/upload/_index.js @@ -0,0 +1,10 @@ +import Upload from './src'; +import UploadDragger from './src/upload-dragger'; + +/* istanbul ignore next */ +Upload.install = function(Vue) { + Vue.component(Upload.name, Upload); + Vue.component(UploadDragger.name, UploadDragger); +}; + +export default { Upload, UploadDragger }; diff --git a/packages/upload/src/index.vue b/packages/upload/src/index.vue index 5dbe755fd..3dd806bf5 100644 --- a/packages/upload/src/index.vue +++ b/packages/upload/src/index.vue @@ -34,6 +34,7 @@ export default { type: String, default: 'file' }, + draggable: Boolean, withCredentials: Boolean, thumbnailMode: Boolean, showUploadList: { @@ -80,7 +81,7 @@ export default { data() { return { - _fileList: [], + uploadFiles: [], dragOver: false, draging: false, tempIndex: 1 @@ -91,13 +92,16 @@ export default { fileList: { immediate: true, handler(fileList) { - this._fileList = fileList.map(item => { - item.status = 'finished'; - item.percentage = 100; - item.uid = Date.now() + this.tempIndex++; + this.uploadFiles = fileList.map(item => { + if (!item.uid) { + item.uid = Date.now() + this.tempIndex++; + } return item; }); } + }, + uploadFiles(value, oldValue) { + // console.log(value, oldValue); } }, @@ -120,11 +124,11 @@ export default { return; } - this._fileList.push(_file); + this.uploadFiles.push(_file); }, handleProgress(ev, file) { var _file = this.getFile(file); - this.onProgress(ev, _file, this._fileList); + this.onProgress(ev, _file, this.uploadFiles); _file.percentage = ev.percent || 0; }, handleSuccess(res, file) { @@ -134,7 +138,7 @@ export default { _file.status = 'finished'; _file.response = res; - this.onSuccess(res, _file, this._fileList); + this.onSuccess(res, _file, this.uploadFiles); setTimeout(() => { _file.showProgress = false; @@ -143,7 +147,7 @@ export default { }, handleError(err, response, file) { var _file = this.getFile(file); - var fileList = this._fileList; + var fileList = this.uploadFiles; _file.status = 'fail'; @@ -152,12 +156,12 @@ export default { this.onError(err, response, file); }, handleRemove(file) { - var fileList = this._fileList; + var fileList = this.uploadFiles; fileList.splice(fileList.indexOf(file), 1); this.onRemove(file, fileList); }, getFile(file) { - var fileList = this._fileList; + var fileList = this.uploadFiles; var target; fileList.every(item => { target = file.uid === item.uid ? item : null; @@ -171,17 +175,39 @@ export default { } }, clearFiles() { - this._fileList = []; + this.uploadFiles = []; + }, + initDraggable() { + const target = this.$el; + const _this = this; + target.addEventListener('dragover', event => { + event.preventDefault(); + _this.draggable = true; + }); + target.addEventListener('drop', event => { + event.preventDefault(); + _this.draggable = false; + }); + target.addEventListener('dragleave', event => { + event.preventDefault(); + _this.draggable = false; + }); + } + }, + + mounted() { + if (this.draggable) { + this.initDraggable(); } }, render(h) { var uploadList; - if (this.showUploadList && !this.thumbnailMode && this.fileList.length) { + if (this.showUploadList && !this.thumbnailMode && this.uploadFiles.length) { uploadList = ( @@ -191,6 +217,7 @@ export default { var props = { props: { type: this.type, + draggable: this.draggable, action: this.action, multiple: this.multiple, 'before-upload': this.beforeUpload, @@ -213,25 +240,23 @@ export default { ? {this.$slots.default} : {this.$slots.default}; - if (this.type === 'select') { - return ( -
- {uploadList} - {uploadComponent} - {this.$slots.tip} -
- ); - } + return ( +
+ {uploadList} + {uploadComponent} + {this.$slots.tip} +
+ ); - if (this.type === 'drag') { - return ( -
- {uploadComponent} - {this.$slots.tip} - {uploadList} -
- ); - } + // if (this.type === 'drag') { + // return ( + //
+ // {uploadComponent} + // {this.$slots.tip} + // {uploadList} + //
+ // ); + // } } }; diff --git a/packages/upload/src/upload-dragger.vue b/packages/upload/src/upload-dragger.vue new file mode 100644 index 000000000..3ffb110c4 --- /dev/null +++ b/packages/upload/src/upload-dragger.vue @@ -0,0 +1,74 @@ + \ No newline at end of file diff --git a/packages/upload/src/upload.vue b/packages/upload/src/upload.vue index 01532dea2..d920e3bcc 100644 --- a/packages/upload/src/upload.vue +++ b/packages/upload/src/upload.vue @@ -6,9 +6,7 @@ 'is-showCover': showCover }" @click="handleClick" - @drop.prevent="onDrop" - @dragover.prevent="dragOver = true" - @dragleave.prevent="dragOver = false"> + > diff --git a/src/index.js b/src/index.js index 91639305e..10ef77516 100644 --- a/src/index.js +++ b/src/index.js @@ -47,6 +47,7 @@ import Icon from '../packages/icon'; import Row from '../packages/row'; import Col from '../packages/col'; import Upload from '../packages/upload'; +import UploadDragger from '../packages/upload-dragger'; import Progress from '../packages/progress'; import Spinner from '../packages/spinner'; import Message from '../packages/message'; @@ -201,6 +202,7 @@ module.exports = { Row, Col, Upload, + UploadDragger, Progress, Spinner, Message,