Commit 8bca10707b9f9497e34688f5ac02440c46b2387b
1 parent
e011898c
update Input on-form-change trigger timing #198
update Input on-form-change trigger timing #198
Showing
2 changed files
with
28 additions
and
486 deletions
Show diff stats
src/components/input/input.vue
... | ... | @@ -150,7 +150,6 @@ |
150 | 150 | }, |
151 | 151 | handleChange (event) { |
152 | 152 | this.$emit('on-change', event); |
153 | - this.$dispatch('on-form-change', this.value); | |
154 | 153 | }, |
155 | 154 | resizeTextarea () { |
156 | 155 | const autosize = this.autosize; |
... | ... | @@ -169,6 +168,7 @@ |
169 | 168 | this.$nextTick(() => { |
170 | 169 | this.resizeTextarea(); |
171 | 170 | }); |
171 | + this.$dispatch('on-form-change', this.value); | |
172 | 172 | } |
173 | 173 | }, |
174 | 174 | ready () { | ... | ... |
test/routers/form.vue
1 | 1 | <template> |
2 | - <div style="width: 600px"> | |
3 | - <i-form v-ref:form-custom :model="formCustom" :rules="ruleCustom" :label-width="80"> | |
4 | - <Form-item label="密码" prop="passwd"> | |
5 | - <i-input type="password" :value.sync="formCustom.passwd"></i-input> | |
6 | - </Form-item> | |
7 | - <Form-item label="确认密码" prop="passwdCheck"> | |
8 | - <i-input type="password" :value.sync="formCustom.passwdCheck"></i-input> | |
9 | - </Form-item> | |
10 | - <Form-item label="年龄" prop="age"> | |
11 | - <i-input type="text" :value.sync="formCustom.age" number></i-input> | |
12 | - </Form-item> | |
13 | - <Form-item> | |
14 | - <i-button type="primary" @click="handleSubmit('formCustom')">提交</i-button> | |
15 | - <i-button type="ghost" @click="handleReset('formCustom')" style="margin-left: 8px">重置</i-button> | |
16 | - </Form-item> | |
17 | - </i-form> | |
18 | - | |
19 | - | |
20 | - | |
21 | - <i-form v-ref:form :model="form" :rules="rules" :label-width="100" label-position="right"> | |
22 | - <form-item label="邮箱" prop="mail"> | |
23 | - <i-input :value.sync="form.mail" placeholder="请输入邮箱"> | |
24 | - <Icon type="ios-email-outline" slot="prepend"></Icon> | |
25 | - </i-input> | |
26 | - </form-item> | |
27 | - <form-item label="密码" prop="passwd"> | |
28 | - <i-input :value.sync="form.passwd"> | |
29 | - <i-select slot="prepend" style="width: 80px"> | |
30 | - <i-option value="http">http://</i-option> | |
31 | - <i-option value="https">https://</i-option> | |
32 | - </i-select> | |
33 | - <i-select slot="append" style="width: 70px"> | |
34 | - <i-option value="com">.com</i-option> | |
35 | - <i-option value="org">.org</i-option> | |
36 | - <i-option value="io">.io</i-option> | |
37 | - </i-select> | |
38 | - </i-input> | |
39 | - </form-item> | |
40 | - <form-item label="textarea" prop="textarea"> | |
41 | - <i-input :value.sync="form.textarea" type="textarea" :autosize="{minRows: 2,maxRows: 5}" placeholder="请输入..."></i-input> | |
42 | - </form-item> | |
43 | - <form-item label="radio" prop="single"> | |
44 | - <radio :checked.sync="form.single">Single</radio> | |
45 | - </form-item> | |
46 | - <form-item label="radioGroup" prop="group"> | |
47 | - <Radio-group :model.sync="form.group"> | |
48 | - <Radio value="apple"> | |
49 | - <Icon type="social-apple"></Icon> | |
50 | - <span>Apple</span> | |
51 | - </Radio> | |
52 | - <Radio value="android"> | |
53 | - <Icon type="social-android"></Icon> | |
54 | - <span>Android</span> | |
55 | - </Radio> | |
56 | - <Radio value="windows"> | |
57 | - <Icon type="social-windows"></Icon> | |
58 | - <span>Windows</span> | |
59 | - </Radio> | |
60 | - </Radio-group> | |
61 | - </form-item> | |
62 | - <form-item label="checkbox-g" prop="checkboxgroup"> | |
63 | - <Checkbox-group :model.sync="form.checkboxgroup"> | |
64 | - <Checkbox value="twitter"> | |
65 | - <Icon type="social-twitter"></Icon> | |
66 | - <span>Twitter</span> | |
67 | - </Checkbox> | |
68 | - <Checkbox value="facebook"> | |
69 | - <Icon type="social-facebook"></Icon> | |
70 | - <span>Facebook</span> | |
71 | - </Checkbox> | |
72 | - <Checkbox value="github"> | |
73 | - <Icon type="social-github"></Icon> | |
74 | - <span>Github</span> | |
75 | - </Checkbox> | |
76 | - <Checkbox value="snapchat"> | |
77 | - <Icon type="social-snapchat"></Icon> | |
78 | - <span>Snapchat</span> | |
79 | - </Checkbox> | |
80 | - <Checkbox value="twitter"> | |
81 | - <Icon type="social-twitter"></Icon> | |
82 | - <span>Twitter</span> | |
83 | - </Checkbox> | |
84 | - <Checkbox value="facebook"> | |
85 | - <Icon type="social-facebook"></Icon> | |
86 | - <span>Facebook</span> | |
87 | - </Checkbox> | |
88 | - <Checkbox value="github"> | |
89 | - <Icon type="social-github"></Icon> | |
90 | - <span>Github</span> | |
91 | - </Checkbox> | |
92 | - <Checkbox value="snapchat"> | |
93 | - <Icon type="social-snapchat"></Icon> | |
94 | - <span>Snapchat</span> | |
95 | - </Checkbox> | |
96 | - <Checkbox value="twitter"> | |
97 | - <Icon type="social-twitter"></Icon> | |
98 | - <span>Twitter</span> | |
99 | - </Checkbox> | |
100 | - <Checkbox value="facebook"> | |
101 | - <Icon type="social-facebook"></Icon> | |
102 | - <span>Facebook</span> | |
103 | - </Checkbox> | |
104 | - <Checkbox value="github"> | |
105 | - <Icon type="social-github"></Icon> | |
106 | - <span>Github</span> | |
107 | - </Checkbox> | |
108 | - <Checkbox value="snapchat"> | |
109 | - <Icon type="social-snapchat"></Icon> | |
110 | - <span>Snapchat</span> | |
111 | - </Checkbox> | |
112 | - <Checkbox value="twitter"> | |
113 | - <Icon type="social-twitter"></Icon> | |
114 | - <span>Twitter</span> | |
115 | - </Checkbox> | |
116 | - <Checkbox value="facebook"> | |
117 | - <Icon type="social-facebook"></Icon> | |
118 | - <span>Facebook</span> | |
119 | - </Checkbox> | |
120 | - <Checkbox value="github"> | |
121 | - <Icon type="social-github"></Icon> | |
122 | - <span>Github</span> | |
123 | - </Checkbox> | |
124 | - <Checkbox value="snapchat"> | |
125 | - <Icon type="social-snapchat"></Icon> | |
126 | - <span>Snapchat</span> | |
127 | - </Checkbox> | |
128 | - <Checkbox value="twitter"> | |
129 | - <Icon type="social-twitter"></Icon> | |
130 | - <span>Twitter</span> | |
131 | - </Checkbox> | |
132 | - <Checkbox value="facebook"> | |
133 | - <Icon type="social-facebook"></Icon> | |
134 | - <span>Facebook</span> | |
135 | - </Checkbox> | |
136 | - <Checkbox value="github"> | |
137 | - <Icon type="social-github"></Icon> | |
138 | - <span>Github</span> | |
139 | - </Checkbox> | |
140 | - <Checkbox value="snapchat"> | |
141 | - <Icon type="social-snapchat"></Icon> | |
142 | - <span>Snapchat</span> | |
143 | - </Checkbox> | |
144 | - <Checkbox value="twitter"> | |
145 | - <Icon type="social-twitter"></Icon> | |
146 | - <span>Twitter</span> | |
147 | - </Checkbox> | |
148 | - <Checkbox value="facebook"> | |
149 | - <Icon type="social-facebook"></Icon> | |
150 | - <span>Facebook</span> | |
151 | - </Checkbox> | |
152 | - <Checkbox value="github"> | |
153 | - <Icon type="social-github"></Icon> | |
154 | - <span>Github</span> | |
155 | - </Checkbox> | |
156 | - <Checkbox value="snapchat"> | |
157 | - <Icon type="social-snapchat"></Icon> | |
158 | - <span>Snapchat</span> | |
159 | - </Checkbox> | |
160 | - </Checkbox-group> | |
161 | - </form-item> | |
162 | - <form-item label="select" prop="select"> | |
163 | - <i-select :model.sync="form.select" style="width:200px" clearable> | |
164 | - <i-option v-for="item in cityList" :value="item.value">{{ item.label }}</i-option> | |
165 | - </i-select> | |
166 | - <i-select :model.sync="model11" filterable> | |
167 | - <i-option v-for="item in cityList" :value="item.value">{{ item.label }}</i-option> | |
168 | - </i-select> | |
169 | - <i-select :model.sync="model12" filterable multiple> | |
170 | - <i-option v-for="item in cityList" :value="item.value">{{ item.label }}</i-option> | |
171 | - </i-select> | |
172 | - </form-item> | |
173 | - <form-item label="select多选" prop="selectm"> | |
174 | - <i-select :model.sync="form.selectm" multiple style="width:260px"> | |
175 | - <i-option v-for="item in cityList" :value="item.value">{{ item.label }}</i-option> | |
176 | - </i-select> | |
177 | - </form-item> | |
178 | - <form-item label="多选滑块" prop="slider"> | |
179 | - <Slider :value.sync="form.slider" range></Slider> | |
180 | - </form-item> | |
181 | - <form-item label="日期" prop="date"> | |
182 | - <Time-picker :value.sync="form.date" type="time" placeholder="选择时间" style="width: 168px"></Time-picker> | |
183 | - </form-item> | |
184 | - <form-item label="两个日期" prop="date2"> | |
185 | - <Date-picker :value.sync="form.date2" type="daterange" placement="bottom-start" placeholder="选择日期" @on-change="c"></Date-picker> | |
186 | - </form-item> | |
187 | - <form-item label="级联" prop="cascader"> | |
188 | - <Cascader :data="data" :value.sync="form.cascader"></Cascader> | |
189 | - </form-item> | |
190 | - <form-item label="穿梭框" prop="targetKeys1"> | |
191 | - <Transfer | |
192 | - :data="form.transfer" | |
193 | - :target-keys="form.targetKeys1" | |
194 | - :render-format="render1" | |
195 | - @on-change="handleChange1"></Transfer> | |
196 | - </form-item> | |
197 | - <form-item label="数字输入框" prop="input"> | |
198 | - <Input-number :max="10" :min="1" :value.sync="form.input"></Input-number> | |
199 | - </form-item> | |
200 | - <form-item> | |
201 | - <i-button type="primary" @click="onSubmit('form')">提交</i-button> | |
202 | - <i-button type="ghost" @click="resetForm('form')">重置</i-button> | |
203 | - </form-item> | |
204 | - </i-form> | |
205 | - </div> | |
2 | + <i-form v-ref:form-inline :model="formInline" :rules="ruleInline" inline> | |
3 | + <Form-item prop="user"> | |
4 | + <i-input type="text" :value.sync="formInline.user" placeholder="Username"> | |
5 | + <Icon type="ios-person-outline" slot="prepend"></Icon> | |
6 | + </i-input> | |
7 | + </Form-item> | |
8 | + <Form-item prop="password"> | |
9 | + <i-input type="password" :value.sync="formInline.password" placeholder="Password"> | |
10 | + <Icon type="ios-locked-outline" slot="prepend"></Icon> | |
11 | + </i-input> | |
12 | + </Form-item> | |
13 | + <Form-item> | |
14 | + <i-button type="primary" @click="handleSubmit('formInline')">登录</i-button> | |
15 | + </Form-item> | |
16 | + </i-form> | |
206 | 17 | </template> |
207 | 18 | <script> |
208 | 19 | export default { |
209 | - props: {}, | |
210 | 20 | data () { |
211 | - const validatePass = (rule, value, callback) => { | |
212 | - if (value === '') { | |
213 | - callback(new Error('请输入密码')); | |
214 | - } else { | |
215 | - if (this.formCustom.passwdCheck !== '') { | |
216 | - this.$refs.formCustom.validateField('passwdCheck'); | |
217 | - } | |
218 | - callback(); | |
219 | - } | |
220 | - }; | |
221 | - const validatePassCheck = (rule, value, callback) => { | |
222 | - if (value === '') { | |
223 | - callback(new Error('请再次输入密码')); | |
224 | - } else if (value !== this.formCustom.passwd) { | |
225 | - callback(new Error('两次输入密码不一致!')); | |
226 | - } else { | |
227 | - callback(); | |
228 | - } | |
229 | - }; | |
230 | - const validateAge = (rule, value, callback) => { | |
231 | - if (!value) { | |
232 | - return callback(new Error('年龄不能为空')); | |
233 | - } | |
234 | - setTimeout(() => { | |
235 | - if (!Number.isInteger(value)) { | |
236 | - callback(new Error('请输入数字值')); | |
237 | - } else { | |
238 | - if (value < 18) { | |
239 | - callback(new Error('必须年满18岁')); | |
240 | - } else { | |
241 | - callback(); | |
242 | - } | |
243 | - } | |
244 | - }, 1000); | |
245 | - }; | |
246 | - | |
247 | 21 | return { |
248 | - data: [{ | |
249 | - value: 'beijing', | |
250 | - label: '北京', | |
251 | - children: [ | |
252 | - { | |
253 | - value: 'gugong', | |
254 | - label: '故宫' | |
255 | - }, | |
256 | - { | |
257 | - value: 'tiantan', | |
258 | - label: '天坛' | |
259 | - }, | |
260 | - { | |
261 | - value: 'wangfujing', | |
262 | - label: '王府井' | |
263 | - } | |
264 | - ] | |
265 | - }, { | |
266 | - value: 'jiangsu', | |
267 | - label: '江苏', | |
268 | - children: [ | |
269 | - { | |
270 | - value: 'nanjing', | |
271 | - label: '南京', | |
272 | - children: [ | |
273 | - { | |
274 | - value: 'fuzimiao', | |
275 | - label: '夫子庙', | |
276 | - } | |
277 | - ] | |
278 | - }, | |
279 | - { | |
280 | - value: 'suzhou', | |
281 | - label: '苏州', | |
282 | - children: [ | |
283 | - { | |
284 | - value: 'zhuozhengyuan', | |
285 | - label: '拙政园', | |
286 | - }, | |
287 | - { | |
288 | - value: 'shizilin', | |
289 | - label: '狮子林', | |
290 | - } | |
291 | - ] | |
292 | - } | |
293 | - ], | |
294 | - }], | |
295 | - cityList: [ | |
296 | - { | |
297 | - value: 'beijing', | |
298 | - label: '北京市' | |
299 | - }, | |
300 | - { | |
301 | - value: 'shanghai', | |
302 | - label: '上海市' | |
303 | - }, | |
304 | - { | |
305 | - value: 'shenzhen', | |
306 | - label: '深圳市' | |
307 | - }, | |
308 | - { | |
309 | - value: 'hangzhou', | |
310 | - label: '杭州市' | |
311 | - }, | |
312 | - { | |
313 | - value: 'nanjing', | |
314 | - label: '南京市' | |
315 | - }, | |
316 | - { | |
317 | - value: 'chongqing', | |
318 | - label: '重庆市' | |
319 | - } | |
320 | - ], | |
321 | - form: { | |
322 | - mail: '', | |
323 | - passwd: '', | |
324 | - single: false, | |
325 | - group: '', | |
326 | - checkboxgroup: [], | |
327 | - select: '', | |
328 | - selectm: [], | |
329 | - slider: [40, 50], | |
330 | - date: '', | |
331 | - date2: '', | |
332 | - cascader: [], | |
333 | - transfer: this.getMockData(), | |
334 | - targetKeys1: this.getTargetKeys(), | |
335 | - input: 1, | |
336 | - textarea: '' | |
337 | - }, | |
338 | - rules: { | |
339 | - mail: [ | |
340 | - { | |
341 | - required: true, message: '请输入正确的邮箱', trigger: 'blur', type: 'email' | |
342 | - }, | |
343 | - { | |
344 | - min: 3, max: 50, message: '长度在 3 到 50 个字符', trigger: 'blur' | |
345 | - }, | |
346 | - { | |
347 | - min: 3, max: 50, message: '长度在 3 到 5 个字符', trigger: 'change' | |
348 | - } | |
349 | - ], | |
350 | - passwd: [ | |
351 | - { | |
352 | - required: true, message: '请输入密码', trigger: 'blur' | |
353 | - } | |
354 | - ], | |
355 | - group: [ | |
356 | - { | |
357 | - required: true, message: '请单选组' | |
358 | - } | |
359 | - ], | |
360 | - checkboxgroup: [ | |
361 | - { | |
362 | - required: true, message: '至少选择2个', min: 2, type: 'array', | |
363 | - }, | |
364 | - { | |
365 | - required: true, message: '至多选择3个', max: 3, type: 'array' | |
366 | - } | |
367 | - ], | |
368 | - select: [ | |
369 | - { | |
370 | - required: true | |
371 | - } | |
372 | - ], | |
373 | - slider: [ | |
374 | - { | |
375 | - type: 'array', len: 2, | |
376 | - fields: { | |
377 | - 0: { | |
378 | - type: 'number', min: 30, 'message': '不能小于30' | |
379 | - }, | |
380 | - 1: { | |
381 | - type: 'number', max: 90, 'message': '不能大于90' | |
382 | - } | |
383 | - } | |
384 | - } | |
385 | - ], | |
386 | - date: [ | |
387 | - { | |
388 | - required: true | |
389 | - }, | |
390 | - { | |
391 | - type: 'date' | |
392 | - } | |
393 | - ], | |
394 | - date2: [ | |
395 | - { | |
396 | - type: 'array', len: 2, | |
397 | - fields: { | |
398 | - 0: { | |
399 | - type: 'date', required: true | |
400 | - }, | |
401 | - 1: { | |
402 | - type: 'date', required: true | |
403 | - } | |
404 | - } | |
405 | - } | |
406 | - ], | |
407 | - cascader: [ | |
408 | - { | |
409 | - type: 'array', required: true | |
410 | - } | |
411 | - ], | |
412 | - targetKeys1: [ | |
413 | - { | |
414 | - type: 'array', min: 8, max: 10 | |
415 | - } | |
416 | - ], | |
417 | - input: [ | |
418 | - { | |
419 | - type: 'number', min: 1, max: 4 | |
420 | - } | |
421 | - ], | |
422 | - textarea: [ | |
423 | - { | |
424 | - required: true, trigger: 'blur' | |
425 | - }, | |
426 | - { | |
427 | - type: 'string', min: 10 | |
428 | - } | |
429 | - ] | |
430 | - }, | |
431 | - formCustom: { | |
432 | - passwd: '', | |
433 | - passwdCheck: '', | |
434 | - age: '' | |
22 | + formInline: { | |
23 | + user: '', | |
24 | + password: '' | |
435 | 25 | }, |
436 | - ruleCustom: { | |
437 | - passwd: [ | |
438 | - { validator: validatePass, trigger: 'blur' } | |
26 | + ruleInline: { | |
27 | + user: [ | |
28 | + { required: true, message: '请填写用户名', trigger: 'change' } | |
439 | 29 | ], |
440 | - passwdCheck: [ | |
441 | - { validator: validatePassCheck, trigger: 'blur' } | |
442 | - ], | |
443 | - age: [ | |
444 | - { validator: validateAge, trigger: 'blur' } | |
30 | + password: [ | |
31 | + { required: true, message: '请填写密码', trigger: 'blur' }, | |
32 | + { type: 'string', min: 6, message: '密码长度不能小于6位', trigger: 'change' } | |
445 | 33 | ] |
446 | 34 | } |
447 | 35 | } |
448 | 36 | }, |
449 | - computed: {}, | |
450 | 37 | methods: { |
451 | - onSubmit (formName) { | |
452 | - this.$refs[formName].validate((valid) => { | |
453 | - if (valid) { | |
454 | - this.$Message.success('submit!'); | |
455 | - } else { | |
456 | - this.$Message.error('error submit!'); | |
457 | - return false; | |
458 | - } | |
459 | - }); | |
460 | - }, | |
461 | - resetForm (formName) { | |
462 | - this.$refs[formName].resetFields(); | |
463 | - }, | |
464 | - c (s) { | |
465 | - console.log(this.form.date) | |
466 | - }, | |
467 | - getMockData () { | |
468 | - let mockData = []; | |
469 | - for (let i = 1; i <= 20; i++) { | |
470 | - mockData.push({ | |
471 | - key: i.toString(), | |
472 | - label: '内容' + i, | |
473 | - description: '内容' + i + '的描述信息', | |
474 | - disabled: Math.random() * 3 < 1 | |
475 | - }); | |
476 | - } | |
477 | - return mockData; | |
478 | - }, | |
479 | - getTargetKeys () { | |
480 | - return this.getMockData() | |
481 | - .filter(() => Math.random() * 2 > 1) | |
482 | - .map(item => item.key); | |
483 | - }, | |
484 | - render1 (item) { | |
485 | - return item.label; | |
486 | - }, | |
487 | - handleChange1 (newTargetKeys, direction, moveKeys) { | |
488 | - console.log(newTargetKeys); | |
489 | - console.log(direction); | |
490 | - console.log(moveKeys); | |
491 | - this.form.targetKeys1 = newTargetKeys; | |
492 | - }, | |
493 | - handleSubmit (name) { | |
38 | + handleSubmit(name) { | |
494 | 39 | this.$refs[name].validate((valid) => { |
495 | 40 | if (valid) { |
496 | 41 | this.$Message.success('提交成功!'); |
... | ... | @@ -498,10 +43,7 @@ |
498 | 43 | this.$Message.error('表单验证失败!'); |
499 | 44 | } |
500 | 45 | }) |
501 | - }, | |
502 | - handleReset (name) { | |
503 | - this.$refs[name].resetFields(); | |
504 | 46 | } |
505 | 47 | } |
506 | - }; | |
507 | -</script> | |
508 | 48 | \ No newline at end of file |
49 | + } | |
50 | +</script> | ... | ... |