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,