Commit fc0c4c781552c9506ba15cb46520c077c16dd622
1 parent
a9e59197
fixed #494
watch trigger after form emit, so the value of date not change when validate, change to async
Showing
2 changed files
with
121 additions
and
79 deletions
Show diff stats
examples/routers/form.vue
| ... | ... | @@ -169,96 +169,136 @@ |
| 169 | 169 | <!--</script>--> |
| 170 | 170 | |
| 171 | 171 | |
| 172 | +<!--<template>--> | |
| 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>--> | |
| 188 | +<!--</template>--> | |
| 189 | +<!--<script>--> | |
| 190 | + <!--export default {--> | |
| 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 | + | |
| 230 | + <!--return {--> | |
| 231 | + <!--formCustom: {--> | |
| 232 | + <!--passwd: '',--> | |
| 233 | + <!--passwdCheck: '',--> | |
| 234 | + <!--age: ''--> | |
| 235 | + <!--},--> | |
| 236 | + <!--ruleCustom: {--> | |
| 237 | + <!--passwd: [--> | |
| 238 | + <!--{ validator: validatePass, trigger: 'blur' }--> | |
| 239 | + <!--],--> | |
| 240 | + <!--passwdCheck: [--> | |
| 241 | + <!--{ validator: validatePassCheck, trigger: 'blur' }--> | |
| 242 | + <!--],--> | |
| 243 | + <!--age: [--> | |
| 244 | + <!--{ validator: validateAge, trigger: 'blur' }--> | |
| 245 | + <!--]--> | |
| 246 | + <!--}--> | |
| 247 | + <!--}--> | |
| 248 | + <!--},--> | |
| 249 | + <!--methods: {--> | |
| 250 | + <!--handleSubmit (name) {--> | |
| 251 | + <!--this.$refs[name].validate((valid) => {--> | |
| 252 | + <!--if (valid) {--> | |
| 253 | + <!--this.$Message.success('提交成功!');--> | |
| 254 | + <!--} else {--> | |
| 255 | + <!--this.$Message.error('表单验证失败!');--> | |
| 256 | + <!--}--> | |
| 257 | + <!--})--> | |
| 258 | + <!--},--> | |
| 259 | + <!--handleReset (name) {--> | |
| 260 | + <!--this.$refs[name].resetFields();--> | |
| 261 | + <!--}--> | |
| 262 | + <!--}--> | |
| 263 | + <!--}--> | |
| 264 | +<!--</script>--> | |
| 265 | + | |
| 172 | 266 | <template> |
| 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> | |
| 267 | + <div> | |
| 268 | + <Form ref="DateForm" :model="form" :rules="rules" :label-width="80" style="width: 400px;"> | |
| 269 | + <Form-item label="选择日期" prop="date"> | |
| 270 | + <Date-picker v-model="form.date" type="datetime"></Date-picker> | |
| 271 | + </Form-item> | |
| 272 | + <Form-item> | |
| 273 | + <Button type="primary" @click.native="handleClick">确定</Button> | |
| 274 | + </Form-item> | |
| 275 | + </Form> | |
| 276 | + </div> | |
| 188 | 277 | </template> |
| 189 | 278 | <script> |
| 190 | 279 | export default { |
| 191 | 280 | 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 | - | |
| 230 | 281 | return { |
| 231 | - formCustom: { | |
| 232 | - passwd: '', | |
| 233 | - passwdCheck: '', | |
| 234 | - age: '' | |
| 282 | + form: { | |
| 283 | + date: '' | |
| 235 | 284 | }, |
| 236 | - ruleCustom: { | |
| 237 | - passwd: [ | |
| 238 | - { validator: validatePass, trigger: 'blur' } | |
| 239 | - ], | |
| 240 | - passwdCheck: [ | |
| 241 | - { validator: validatePassCheck, trigger: 'blur' } | |
| 242 | - ], | |
| 243 | - age: [ | |
| 244 | - { validator: validateAge, trigger: 'blur' } | |
| 285 | + rules: { | |
| 286 | + date: [ | |
| 287 | + { required: true, type: 'date', message: '不能为空', trigger: 'change' }, | |
| 288 | + { type: 'date', message: '日期格式不正确', trigger: 'change'} | |
| 245 | 289 | ] |
| 246 | 290 | } |
| 247 | 291 | } |
| 248 | 292 | }, |
| 249 | 293 | methods: { |
| 250 | - handleSubmit (name) { | |
| 251 | - this.$refs[name].validate((valid) => { | |
| 252 | - if (valid) { | |
| 253 | - this.$Message.success('提交成功!'); | |
| 254 | - } else { | |
| 255 | - this.$Message.error('表单验证失败!'); | |
| 256 | - } | |
| 257 | - }) | |
| 258 | - }, | |
| 259 | - handleReset (name) { | |
| 260 | - this.$refs[name].resetFields(); | |
| 294 | + handleClick() { | |
| 295 | + this.$refs.DateForm.validate(); | |
| 296 | + } | |
| 297 | + }, | |
| 298 | + watch: { | |
| 299 | + 'form.date' (val) { | |
| 300 | + console.log(val); | |
| 261 | 301 | } |
| 262 | 302 | } |
| 263 | 303 | } |
| 264 | 304 | -</script> |
| 305 | +</script> | |
| 265 | 306 | \ No newline at end of file | ... | ... |
src/components/date-picker/picker.vue
| ... | ... | @@ -423,7 +423,9 @@ |
| 423 | 423 | const newDate = this.formattingDate(date); |
| 424 | 424 | |
| 425 | 425 | this.$emit('on-change', newDate); |
| 426 | - this.dispatch('FormItem', 'on-form-change', newDate); | |
| 426 | + this.$nextTick(() => { | |
| 427 | + this.dispatch('FormItem', 'on-form-change', newDate); | |
| 428 | + }); | |
| 427 | 429 | }, |
| 428 | 430 | formattingDate (date) { |
| 429 | 431 | const type = this.type; | ... | ... |