Commit bf9649f6e8f0c00245318ccbbb7157892933b7a8

Authored by 梁灏
1 parent 4ed43a17

add Form

examples/routers/form.vue
  1 +<!--<template>-->
  2 + <!--<div>-->
  3 + <!--date: {{ formInline.date }}-->
  4 + <!--<i-form ref="formInline" :model="formInline" :rules="ruleInline">-->
  5 + <!--<Form-item prop="date" label="日期">-->
  6 + <!--<Date-picker type="date" placeholder="选择日期" v-model="formInline.date"></Date-picker>-->
  7 + <!--</Form-item>-->
  8 + <!--<Form-item prop="value2" label="级联选择">-->
  9 + <!--<Cascader :data="formInline.data" v-model="formInline.value2" change-on-select></Cascader>-->
  10 + <!--</Form-item>-->
  11 + <!--<Form-item prop="user" label="输入框">-->
  12 + <!--<Input v-model="formInline.user"></Input>-->
  13 + <!--</Form-item>-->
  14 + <!--<Form-item prop="targetKeys1" label="穿梭框">-->
  15 + <!--<Transfer-->
  16 + <!--filterable-->
  17 + <!--:data="formInline.data1"-->
  18 + <!--:target-keys="formInline.targetKeys1"-->
  19 + <!--:render-format="render1"-->
  20 + <!--@on-change="handleChange1"></Transfer>-->
  21 + <!--</Form-item>-->
  22 + <!--<Form-item>-->
  23 + <!--<i-button type="primary" @click.native="handleSubmit('formInline')">登录</i-button>-->
  24 + <!--</Form-item>-->
  25 + <!--</i-form>-->
  26 + <!--</div>-->
  27 +<!--</template>-->
  28 +<!--<script>-->
  29 + <!--export default {-->
  30 + <!--data () {-->
  31 + <!--return {-->
  32 + <!--formInline: {-->
  33 + <!--data1: this.getMockData(),-->
  34 + <!--targetKeys1: this.getTargetKeys(),-->
  35 + <!--date: new Date(),-->
  36 + <!--user: '',-->
  37 + <!--value2: [],-->
  38 + <!--data: [{-->
  39 + <!--value: 'beijing',-->
  40 + <!--label: '北京',-->
  41 + <!--children: [-->
  42 + <!--{-->
  43 + <!--value: 'gugong',-->
  44 + <!--label: '故宫'-->
  45 + <!--},-->
  46 + <!--{-->
  47 + <!--value: 'tiantan',-->
  48 + <!--label: '天坛'-->
  49 + <!--},-->
  50 + <!--{-->
  51 + <!--value: 'wangfujing',-->
  52 + <!--label: '王府井'-->
  53 + <!--}-->
  54 + <!--]-->
  55 + <!--}, {-->
  56 + <!--value: 'jiangsu',-->
  57 + <!--label: '江苏',-->
  58 + <!--children: [-->
  59 + <!--{-->
  60 + <!--value: 'nanjing',-->
  61 + <!--label: '南京',-->
  62 + <!--children: [-->
  63 + <!--{-->
  64 + <!--value: 'fuzimiao',-->
  65 + <!--label: '夫子庙',-->
  66 + <!--}-->
  67 + <!--]-->
  68 + <!--},-->
  69 + <!--{-->
  70 + <!--value: 'suzhou',-->
  71 + <!--label: '苏州',-->
  72 + <!--children: [-->
  73 + <!--{-->
  74 + <!--value: 'zhuozhengyuan',-->
  75 + <!--label: '拙政园',-->
  76 + <!--},-->
  77 + <!--{-->
  78 + <!--value: 'shizilin',-->
  79 + <!--label: '狮子林',-->
  80 + <!--}-->
  81 + <!--]-->
  82 + <!--}-->
  83 + <!--],-->
  84 + <!--}]-->
  85 + <!--},-->
  86 + <!--ruleInline: {-->
  87 + <!--date: [-->
  88 + <!--{-->
  89 + <!--required: true,-->
  90 + <!--type: 'date',-->
  91 + <!--message: '请选择日期',-->
  92 + <!--trigger: 'change'-->
  93 + <!--}-->
  94 + <!--],-->
  95 + <!--user: [-->
  96 + <!--{-->
  97 + <!--required: true,-->
  98 + <!--message: '请输入',-->
  99 + <!--trigger: 'change',-->
  100 + <!--min: 10-->
  101 + <!--},-->
  102 + <!--{-->
  103 + <!--required: true,-->
  104 + <!--message: '请输入2',-->
  105 + <!--trigger: 'blur'-->
  106 + <!--}-->
  107 + <!--],-->
  108 + <!--value2: [-->
  109 + <!--{-->
  110 + <!--required: true,-->
  111 + <!--type: 'array',-->
  112 + <!--message: '请输入',-->
  113 + <!--trigger: 'change'-->
  114 + <!--}-->
  115 + <!--],-->
  116 + <!--targetKeys1: [-->
  117 + <!--{-->
  118 + <!--required: true,-->
  119 + <!--type: 'array',-->
  120 + <!--max: 2,-->
  121 + <!--message: '太多了',-->
  122 + <!--trigger: 'change'-->
  123 + <!--}-->
  124 + <!--]-->
  125 + <!--}-->
  126 + <!--}-->
  127 + <!--},-->
  128 + <!--methods: {-->
  129 + <!--handleSubmit(name) {-->
  130 + <!--this.$refs[name].validate((valid) => {-->
  131 + <!--if (valid) {-->
  132 + <!--this.$Message.success('提交成功!');-->
  133 + <!--} else {-->
  134 + <!--this.$Message.error('表单验证失败!');-->
  135 + <!--}-->
  136 + <!--})-->
  137 + <!--},-->
  138 + <!--handleInput (val) {-->
  139 + <!--console.log(val)-->
  140 + <!--},-->
  141 + <!--getMockData () {-->
  142 + <!--let mockData = [];-->
  143 + <!--for (let i = 1; i <= 20; i++) {-->
  144 + <!--mockData.push({-->
  145 + <!--key: i.toString(),-->
  146 + <!--label: '内容' + i,-->
  147 + <!--description: '内容' + i + '的描述信息',-->
  148 + <!--disabled: Math.random() * 3 < 1-->
  149 + <!--});-->
  150 + <!--}-->
  151 + <!--return mockData;-->
  152 + <!--},-->
  153 + <!--getTargetKeys () {-->
  154 + <!--return this.getMockData()-->
  155 + <!--.filter(() => Math.random() * 2 > 1)-->
  156 + <!--.map(item => item.key);-->
  157 + <!--},-->
  158 + <!--render1 (item) {-->
  159 + <!--return item.label;-->
  160 + <!--},-->
  161 + <!--handleChange1 (newTargetKeys, direction, moveKeys) {-->
  162 + <!--console.log(newTargetKeys);-->
  163 + <!--console.log(direction);-->
  164 + <!--console.log(moveKeys);-->
  165 + <!--this.formInline.targetKeys1 = newTargetKeys;-->
  166 + <!--}-->
  167 + <!--}-->
  168 + <!--}-->
  169 +<!--</script>-->
  170 +
  171 +
1 <template> 172 <template>
2 - <div>  
3 - date: {{ formInline.date }}  
4 - <i-form ref="formInline" :model="formInline" :rules="ruleInline">  
5 - <Form-item prop="date" label="日期">  
6 - <Date-picker type="date" placeholder="选择日期" v-model="formInline.date"></Date-picker>  
7 - </Form-item>  
8 - <Form-item prop="value2" label="级联选择">  
9 - <Cascader :data="formInline.data" v-model="formInline.value2" change-on-select></Cascader>  
10 - </Form-item>  
11 - <Form-item prop="user" label="输入框">  
12 - <Input v-model="formInline.user"></Input>  
13 - </Form-item>  
14 - <Form-item prop="targetKeys1" label="穿梭框">  
15 - <Transfer  
16 - filterable  
17 - :data="formInline.data1"  
18 - :target-keys="formInline.targetKeys1"  
19 - :render-format="render1"  
20 - @on-change="handleChange1"></Transfer>  
21 - </Form-item>  
22 - <Form-item>  
23 - <i-button type="primary" @click.native="handleSubmit('formInline')">登录</i-button>  
24 - </Form-item>  
25 - </i-form>  
26 - </div> 173 + <Form ref="formCustom" :model="formCustom" :rules="ruleCustom" :label-width="80">
  174 + <Form-item label="密码" prop="passwd">
  175 + <Input type="password" v-model="formCustom.passwd"></Input>
  176 + </Form-item>
  177 + <Form-item label="确认密码" prop="passwdCheck">
  178 + <Input type="password" v-model="formCustom.passwdCheck"></Input>
  179 + </Form-item>
  180 + <Form-item label="年龄" prop="age">
  181 + <Input type="text" v-model="formCustom.age" number></Input>
  182 + </Form-item>
  183 + <Form-item>
  184 + <Button type="primary" @click="handleSubmit('formCustom')">提交</Button>
  185 + <Button type="ghost" @click="handleReset('formCustom')" style="margin-left: 8px">重置</Button>
  186 + </Form-item>
  187 + </Form>
27 </template> 188 </template>
28 <script> 189 <script>
29 export default { 190 export default {
30 data () { 191 data () {
  192 + const validatePass = (rule, value, callback) => {
  193 + if (value === '') {
  194 + callback(new Error('请输入密码'));
  195 + } else {
  196 + if (this.formCustom.passwdCheck !== '') {
  197 + // 对第二个密码框单独验证
  198 + this.$refs.formCustom.validateField('passwdCheck');
  199 + }
  200 + callback();
  201 + }
  202 + };
  203 + const validatePassCheck = (rule, value, callback) => {
  204 + if (value === '') {
  205 + callback(new Error('请再次输入密码'));
  206 + } else if (value !== this.formCustom.passwd) {
  207 + callback(new Error('两次输入密码不一致!'));
  208 + } else {
  209 + callback();
  210 + }
  211 + };
  212 + const validateAge = (rule, value, callback) => {
  213 + if (!value) {
  214 + return callback(new Error('年龄不能为空'));
  215 + }
  216 + // 模拟异步验证效果
  217 + setTimeout(() => {
  218 + if (!Number.isInteger(value)) {
  219 + callback(new Error('请输入数字值'));
  220 + } else {
  221 + if (value < 18) {
  222 + callback(new Error('必须年满18岁'));
  223 + } else {
  224 + callback();
  225 + }
  226 + }
  227 + }, 1000);
  228 + };
  229 +
31 return { 230 return {
32 - formInline: {  
33 - data1: this.getMockData(),  
34 - targetKeys1: this.getTargetKeys(),  
35 - date: new Date(),  
36 - user: '',  
37 - value2: [],  
38 - data: [{  
39 - value: 'beijing',  
40 - label: '北京',  
41 - children: [  
42 - {  
43 - value: 'gugong',  
44 - label: '故宫'  
45 - },  
46 - {  
47 - value: 'tiantan',  
48 - label: '天坛'  
49 - },  
50 - {  
51 - value: 'wangfujing',  
52 - label: '王府井'  
53 - }  
54 - ]  
55 - }, {  
56 - value: 'jiangsu',  
57 - label: '江苏',  
58 - children: [  
59 - {  
60 - value: 'nanjing',  
61 - label: '南京',  
62 - children: [  
63 - {  
64 - value: 'fuzimiao',  
65 - label: '夫子庙',  
66 - }  
67 - ]  
68 - },  
69 - {  
70 - value: 'suzhou',  
71 - label: '苏州',  
72 - children: [  
73 - {  
74 - value: 'zhuozhengyuan',  
75 - label: '拙政园',  
76 - },  
77 - {  
78 - value: 'shizilin',  
79 - label: '狮子林',  
80 - }  
81 - ]  
82 - }  
83 - ],  
84 - }] 231 + formCustom: {
  232 + passwd: '',
  233 + passwdCheck: '',
  234 + age: ''
85 }, 235 },
86 - ruleInline: {  
87 - date: [  
88 - {  
89 - required: true,  
90 - type: 'date',  
91 - message: '请选择日期',  
92 - trigger: 'change'  
93 - } 236 + ruleCustom: {
  237 + passwd: [
  238 + { validator: validatePass, trigger: 'blur' }
94 ], 239 ],
95 - user: [  
96 - {  
97 - required: true,  
98 - message: '请输入',  
99 - trigger: 'change',  
100 - min: 10  
101 - },  
102 - {  
103 - required: true,  
104 - message: '请输入2',  
105 - trigger: 'blur'  
106 - } 240 + passwdCheck: [
  241 + { validator: validatePassCheck, trigger: 'blur' }
107 ], 242 ],
108 - value2: [  
109 - {  
110 - required: true,  
111 - type: 'array',  
112 - message: '请输入',  
113 - trigger: 'change'  
114 - }  
115 - ],  
116 - targetKeys1: [  
117 - {  
118 - required: true,  
119 - type: 'array',  
120 - max: 2,  
121 - message: '太多了',  
122 - trigger: 'change'  
123 - } 243 + age: [
  244 + { validator: validateAge, trigger: 'blur' }
124 ] 245 ]
125 } 246 }
126 } 247 }
127 }, 248 },
128 methods: { 249 methods: {
129 - handleSubmit(name) { 250 + handleSubmit (name) {
130 this.$refs[name].validate((valid) => { 251 this.$refs[name].validate((valid) => {
131 if (valid) { 252 if (valid) {
132 this.$Message.success('提交成功!'); 253 this.$Message.success('提交成功!');
@@ -135,34 +256,8 @@ @@ -135,34 +256,8 @@
135 } 256 }
136 }) 257 })
137 }, 258 },
138 - handleInput (val) {  
139 - console.log(val)  
140 - },  
141 - getMockData () {  
142 - let mockData = [];  
143 - for (let i = 1; i <= 20; i++) {  
144 - mockData.push({  
145 - key: i.toString(),  
146 - label: '内容' + i,  
147 - description: '内容' + i + '的描述信息',  
148 - disabled: Math.random() * 3 < 1  
149 - });  
150 - }  
151 - return mockData;  
152 - },  
153 - getTargetKeys () {  
154 - return this.getMockData()  
155 - .filter(() => Math.random() * 2 > 1)  
156 - .map(item => item.key);  
157 - },  
158 - render1 (item) {  
159 - return item.label;  
160 - },  
161 - handleChange1 (newTargetKeys, direction, moveKeys) {  
162 - console.log(newTargetKeys);  
163 - console.log(direction);  
164 - console.log(moveKeys);  
165 - this.formInline.targetKeys1 = newTargetKeys; 259 + handleReset (name) {
  260 + this.$refs[name].resetFields();
166 } 261 }
167 } 262 }
168 } 263 }
examples/routers/upload.vue
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>-->  
14 - <!--</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>-->  
36 -<!--</template>-->  
37 -<!--<script>-->  
38 - <!--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 -  
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 - <!--}-->  
109 -<!--</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> 1 <template>
151 <div> 2 <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> 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>
  14 + </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>
154 </Upload> 33 </Upload>
155 - <i-button @click.native="handleUpload">上传</i-button> 34 + {{ visible }}
156 </div> 35 </div>
157 </template> 36 </template>
158 <script> 37 <script>
159 export default { 38 export default {
160 data () { 39 data () {
161 return { 40 return {
162 - file: null 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: []
163 } 54 }
164 }, 55 },
  56 + computed: {
  57 +// uploadList () {
  58 +// return this.$refs.upload ? this.$refs.upload.fileList : [];
  59 +// }
  60 + },
  61 + watch: {
  62 +
  63 + },
  64 + mounted () {
  65 + this.uploadList = this.$refs.upload.fileList;
  66 +// console.log(this.$refs.upload.fileList)
  67 + },
165 methods: { 68 methods: {
166 - handleBeforeUpload (file) {  
167 - this.file = file;  
168 - return false; 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;
169 }, 103 },
170 - handleUpload () {  
171 - this.$refs.file.post(this.file); 104 + handleProgress (s) {
  105 + console.log(s)
172 } 106 }
173 } 107 }
174 } 108 }
175 </script> 109 </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>-->
@@ -67,6 +67,7 @@ const iview = { @@ -67,6 +67,7 @@ const iview = {
67 Dropdown, 67 Dropdown,
68 DropdownItem: Dropdown.Item, 68 DropdownItem: Dropdown.Item,
69 DropdownMenu: Dropdown.Menu, 69 DropdownMenu: Dropdown.Menu,
  70 + Form,
70 iForm: Form, 71 iForm: Form,
71 FormItem: Form.Item, 72 FormItem: Form.Item,
72 Col, 73 Col,
@@ -103,6 +104,7 @@ const iview = { @@ -103,6 +104,7 @@ const iview = {
103 Spin, 104 Spin,
104 Step: Steps.Step, 105 Step: Steps.Step,
105 Steps, 106 Steps,
  107 + // Switch,
106 iSwitch: Switch, 108 iSwitch: Switch,
107 iTable: Table, 109 iTable: Table,
108 Table, 110 Table,