Commit 929d4915345bd6f34b408a324517d83b2061d65a

Authored by 梁灏
1 parent 24c10245

Upload add paste prop

examples/routers/upload.vue
1 1 <template>
2   - <div>
3   - <div class="demo-upload-list" v-for="item in uploadList">
4   - <template v-if="item.status === 'finished'">
5   - <img :src="item.url">
6   - <div class="demo-upload-list-cover">
7   - <Icon type="ios-eye-outline" @click.native="handleView(item.name)"></Icon>
8   - <Icon type="ios-trash-outline" @click.native="handleRemove(item)"></Icon>
9   - </div>
10   - </template>
11   - <template v-else>
12   - <i-progress v-if="item.showProgress" :percent="item.percentage" hide-info></i-progress>
13   - </template>
  2 + <Upload
  3 + multiple
  4 + type="drag"
  5 + paste
  6 + action="//jsonplaceholder.typicode.com/posts/">
  7 + <div style="padding: 20px 0">
  8 + <Icon type="ios-cloud-upload" size="52" style="color: #3399ff"></Icon>
  9 + <p>Click or drag files here to upload</p>
14 10 </div>
15   - <Upload
16   - ref="upload"
17   - :show-upload-list="false"
18   - :default-file-list="defaultList"
19   - :on-success="handleSuccess"
20   - :format="['jpg','jpeg','png']"
21   - :max-size="2048"
22   - :on-format-error="handleFormatError"
23   - :on-exceeded-size="handleMaxSize"
24   - @on-progress="handleProgress"
25   - :before-upload="handleBeforeUpload"
26   - multiple
27   - type="drag"
28   - action="//jsonplaceholder.typicode.com/posts/"
29   - style="display: inline-block;width:58px;">
30   - <div style="width: 58px;height:58px;line-height: 58px;">
31   - <Icon type="camera" size="20"></Icon>
32   - </div>
33   - </Upload>
34   - {{ visible }}
35   - </div>
  11 + </Upload>
36 12 </template>
37 13 <script>
38 14 export default {
39   - data () {
40   - return {
41   - defaultList: [
42   - {
43   - 'name': 'a42bdcc1178e62b4694c830f028db5c0',
44   - 'url': 'https://o5wwk8baw.qnssl.com/a42bdcc1178e62b4694c830f028db5c0/avatar'
45   - },
46   - {
47   - 'name': 'bc7521e033abdd1e92222d733590f104',
48   - 'url': 'https://o5wwk8baw.qnssl.com/bc7521e033abdd1e92222d733590f104/avatar'
49   - }
50   - ],
51   - imgName: '',
52   - visible: false,
53   - uploadList: []
54   - }
55   - },
56   - computed: {
57   -// uploadList () {
58   -// return this.$refs.upload ? this.$refs.upload.fileList : [];
59   -// }
60   - },
61   - watch: {
62 15  
63   - },
64   - mounted () {
65   - this.uploadList = this.$refs.upload.fileList;
66   -// console.log(this.$refs.upload.fileList)
67   - },
68   - methods: {
69   - handleView (name) {
70   - this.imgName = name;
71   - this.visible = true;
72   - },
73   - handleRemove (file) {
74   - // 从 upload 实例删除数据
75   - const fileList = this.$refs.upload.fileList;
76   - this.$refs.upload.fileList.splice(fileList.indexOf(file), 1);
77   - },
78   - handleSuccess (res, file) {
79   - // 因为上传过程为实例,这里模拟添加 url
80   - file.url = 'https://o5wwk8baw.qnssl.com/7eb99afb9d5f317c912f08b5212fd69a/avatar';
81   - file.name = '7eb99afb9d5f317c912f08b5212fd69a';
82   - },
83   - handleFormatError (file) {
84   - this.$Notice.warning({
85   - title: '文件格式不正确',
86   - desc: '文件 ' + file.name + ' 格式不正确,请上传 jpg 或 png 格式的图片。'
87   - });
88   - },
89   - handleMaxSize (file) {
90   - this.$Notice.warning({
91   - title: '超出文件大小限制',
92   - desc: '文件 ' + file.name + ' 太大,不能超过 2M。'
93   - });
94   - },
95   - handleBeforeUpload () {
96   - const check = this.uploadList.length < 5;
97   - if (!check) {
98   - this.$Notice.warning({
99   - title: '最多只能上传 5 张图片。'
100   - });
101   - }
102   - return check;
103   - },
104   - handleProgress (s) {
105   - console.log(s)
106   - }
107   - }
108 16 }
109 17 </script>
110   -<style>
111   - .demo-upload-list{
112   - display: inline-block;
113   - width: 60px;
114   - height: 60px;
115   - text-align: center;
116   - line-height: 60px;
117   - border: 1px solid transparent;
118   - border-radius: 4px;
119   - overflow: hidden;
120   - background: #fff;
121   - position: relative;
122   - box-shadow: 0 1px 1px rgba(0,0,0,.2);
123   - margin-right: 4px;
124   - }
125   - .demo-upload-list img{
126   - width: 100%;
127   - height: 100%;
128   - }
129   - .demo-upload-list-cover{
130   - display: none;
131   - position: absolute;
132   - top: 0;
133   - bottom: 0;
134   - left: 0;
135   - right: 0;
136   - background: rgba(0,0,0,.6);
137   - }
138   - .demo-upload-list:hover .demo-upload-list-cover{
139   - display: block;
140   - }
141   - .demo-upload-list-cover i{
142   - color: #fff;
143   - font-size: 20px;
144   - cursor: pointer;
145   - margin: 0 2px;
146   - }
147   -</style>
148   -
149   -
150   -<!--<template>-->
151   - <!--<div>-->
152   - <!--<Upload action="//jsonplaceholder.typicode.com/posts/" :before-upload="handleBeforeUpload" ref="file">-->
153   - <!--<i-button type="ghost" icon="ios-cloud-upload-outline">选择文件</i-button>-->
154   - <!--</Upload>-->
155   - <!--<i-button @click.native="handleUpload">上传</i-button>-->
156   - <!--</div>-->
157   -<!--</template>-->
158   -<!--<script>-->
159   - <!--export default {-->
160   - <!--data () {-->
161   - <!--return {-->
162   - <!--file: null-->
163   - <!--}-->
164   - <!--},-->
165   - <!--methods: {-->
166   - <!--handleBeforeUpload (file) {-->
167   - <!--this.file = file;-->
168   - <!--return false;-->
169   - <!--},-->
170   - <!--handleUpload () {-->
171   - <!--this.$refs.file.post(this.file);-->
172   - <!--}-->
173   - <!--}-->
174   - <!--}-->
175   -<!--</script>-->
... ...
src/components/upload/upload.vue
... ... @@ -4,6 +4,7 @@
4 4 :class="classes"
5 5 @click="handleClick"
6 6 @drop.prevent="onDrop"
  7 + @paste="handlePaste"
7 8 @dragover.prevent="dragOver = true"
8 9 @dragleave.prevent="dragOver = false">
9 10 <input
... ... @@ -132,6 +133,10 @@
132 133 default() {
133 134 return [];
134 135 }
  136 + },
  137 + paste: {
  138 + type: Boolean,
  139 + default: false
135 140 }
136 141 },
137 142 data () {
... ... @@ -172,6 +177,11 @@
172 177 this.dragOver = false;
173 178 this.uploadFiles(e.dataTransfer.files);
174 179 },
  180 + handlePaste (e) {
  181 + if (this.paste) {
  182 + this.uploadFiles(e.clipboardData.files);
  183 + }
  184 + },
175 185 uploadFiles (files) {
176 186 let postFiles = Array.prototype.slice.call(files);
177 187 if (!this.multiple) postFiles = postFiles.slice(0, 1);
... ...