Commit 8f6aeda4be082f94b858117ad747858226cdc126
1 parent
4ec8bc8a
Fix parser and formater
Showing
1 changed file
with
24 additions
and
33 deletions
Show diff stats
src/components/date-picker/picker.vue
| @@ -267,13 +267,11 @@ | @@ -267,13 +267,11 @@ | ||
| 267 | } | 267 | } |
| 268 | }, | 268 | }, |
| 269 | data(){ | 269 | data(){ |
| 270 | - const initialValue = this.formatDate(this.value); | ||
| 271 | - | ||
| 272 | return { | 270 | return { |
| 273 | prefixCls: prefixCls, | 271 | prefixCls: prefixCls, |
| 274 | showClose: false, | 272 | showClose: false, |
| 275 | visible: false, | 273 | visible: false, |
| 276 | - internalValue: initialValue, | 274 | + internalValue: this.parseDate(this.value), |
| 277 | disableClickOutSide: false, // fixed when click a date,trigger clickoutside to close picker | 275 | disableClickOutSide: false, // fixed when click a date,trigger clickoutside to close picker |
| 278 | disableCloseUnderTransfer: false, // transfer 模式下,点击Drop也会触发关闭, | 276 | disableCloseUnderTransfer: false, // transfer 模式下,点击Drop也会触发关闭, |
| 279 | selectionMode: this.onSelectionModeChange(this.type) | 277 | selectionMode: this.onSelectionModeChange(this.type) |
| @@ -282,10 +280,11 @@ | @@ -282,10 +280,11 @@ | ||
| 282 | computed: { | 280 | computed: { |
| 283 | publicValue(){ | 281 | publicValue(){ |
| 284 | if (this.multiple){ | 282 | if (this.multiple){ |
| 285 | - return this.internalValue.map(date => this.formatDate(date)); | 283 | + return this.internalValue.slice(); |
| 286 | } else { | 284 | } else { |
| 287 | const isRange = this.type.includes('range'); | 285 | const isRange = this.type.includes('range'); |
| 288 | - return isRange ? this.formatDate(this.internalValue) : this.formatDate(this.internalValue[0]); | 286 | + const val = this.internalValue.map(date => date instanceof Date ? new Date(date) : date); |
| 287 | + return (isRange || this.multiple) ? val : val[0]; | ||
| 289 | } | 288 | } |
| 290 | }, | 289 | }, |
| 291 | 290 | ||
| @@ -307,13 +306,7 @@ | @@ -307,13 +306,7 @@ | ||
| 307 | if (!value) return; | 306 | if (!value) return; |
| 308 | 307 | ||
| 309 | if (this.multiple) return value.map(date => this.formatDate(date)).join(', '); | 308 | if (this.multiple) return value.map(date => this.formatDate(date)).join(', '); |
| 310 | - | ||
| 311 | - const formatter = ( | ||
| 312 | - TYPE_VALUE_RESOLVER_MAP[this.type] || | ||
| 313 | - TYPE_VALUE_RESOLVER_MAP['default'] | ||
| 314 | - ).formatter; | ||
| 315 | - const format = DEFAULT_FORMATS[this.type]; | ||
| 316 | - return formatter(value, this.format || format); | 309 | + return this.formatDate(value); |
| 317 | }, | 310 | }, |
| 318 | isConfirm(){ | 311 | isConfirm(){ |
| 319 | return this.confirm || this.type === 'datetime' || this.type === 'datetimerange' || this.multiple; | 312 | return this.confirm || this.type === 'datetime' || this.type === 'datetimerange' || this.multiple; |
| @@ -353,7 +346,7 @@ | @@ -353,7 +346,7 @@ | ||
| 353 | 346 | ||
| 354 | if (newValue !== oldValue) { | 347 | if (newValue !== oldValue) { |
| 355 | this.emitChange(); | 348 | this.emitChange(); |
| 356 | - this.internalValue = this.formatDate(newValue); | 349 | + this.internalValue = this.parseDate(newValue); |
| 357 | } | 350 | } |
| 358 | }, | 351 | }, |
| 359 | handleInputMouseenter () { | 352 | handleInputMouseenter () { |
| @@ -390,9 +383,8 @@ | @@ -390,9 +383,8 @@ | ||
| 390 | this.dispatch('FormItem', 'on-form-change', this.publicValue); | 383 | this.dispatch('FormItem', 'on-form-change', this.publicValue); |
| 391 | }); | 384 | }); |
| 392 | }, | 385 | }, |
| 393 | - formatDate (val) { | 386 | + parseDate(val) { |
| 394 | const isRange = this.type.includes('range'); | 387 | const isRange = this.type.includes('range'); |
| 395 | - | ||
| 396 | const type = this.type; | 388 | const type = this.type; |
| 397 | const parser = ( | 389 | const parser = ( |
| 398 | TYPE_VALUE_RESOLVER_MAP[type] || | 390 | TYPE_VALUE_RESOLVER_MAP[type] || |
| @@ -408,11 +400,20 @@ | @@ -408,11 +400,20 @@ | ||
| 408 | val = val.map(date => new Date(date)); // try to parse | 400 | val = val.map(date => new Date(date)); // try to parse |
| 409 | val = val.map(date => isNaN(date.getTime()) ? null : date); // check if parse passed | 401 | val = val.map(date => isNaN(date.getTime()) ? null : date); // check if parse passed |
| 410 | } | 402 | } |
| 411 | - } else if (typeof val === 'string' && type.indexOf('time') !== 0 ){ | 403 | + } else if (typeof val === 'string' && type.indexOf('time') !== 0){ |
| 412 | val = parser(val, this.format || DEFAULT_FORMATS[type]) || val; | 404 | val = parser(val, this.format || DEFAULT_FORMATS[type]) || val; |
| 413 | } | 405 | } |
| 406 | + | ||
| 414 | return isRange ? val : [val]; | 407 | return isRange ? val : [val]; |
| 415 | }, | 408 | }, |
| 409 | + formatDate(value){ | ||
| 410 | + const {formatter} = ( | ||
| 411 | + TYPE_VALUE_RESOLVER_MAP[this.type] || | ||
| 412 | + TYPE_VALUE_RESOLVER_MAP['default'] | ||
| 413 | + ); | ||
| 414 | + const format = DEFAULT_FORMATS[this.type]; | ||
| 415 | + return formatter(value, this.format || format); | ||
| 416 | + }, | ||
| 416 | onPick(dates, visible = false) { | 417 | onPick(dates, visible = false) { |
| 417 | 418 | ||
| 418 | if (this.multiple){ | 419 | if (this.multiple){ |
| @@ -442,30 +443,20 @@ | @@ -442,30 +443,20 @@ | ||
| 442 | this.$emit('on-open-change', state); | 443 | this.$emit('on-open-change', state); |
| 443 | }, | 444 | }, |
| 444 | value(val) { | 445 | value(val) { |
| 445 | - const type = this.type; | ||
| 446 | - const parser = ( | ||
| 447 | - TYPE_VALUE_RESOLVER_MAP[type] || | ||
| 448 | - TYPE_VALUE_RESOLVER_MAP['default'] | ||
| 449 | - ).parser; | ||
| 450 | - | ||
| 451 | - if (val && type === 'time' && !(val instanceof Date)) { | ||
| 452 | - val = parser(val, this.format || DEFAULT_FORMATS[type]); | ||
| 453 | - } else if (val && type.match(/range$/) && Array.isArray(val) && val.filter(Boolean).length === 2 && !(val[0] instanceof Date) && !(val[1] instanceof Date)) { | ||
| 454 | - val = val.join(RANGE_SEPARATOR); | ||
| 455 | - val = parser(val, this.format || DEFAULT_FORMATS[type]); | ||
| 456 | - } else if (typeof val === 'string' && type.indexOf('time') !== 0 ){ | ||
| 457 | - val = parser(val, this.format || DEFAULT_FORMATS[type]) || val; | ||
| 458 | - } | 446 | + this.internalValue = this.parseDate(val); |
| 459 | 447 | ||
| 460 | - this.internalValue = val; | ||
| 461 | - this.$emit('input', val); | ||
| 462 | }, | 448 | }, |
| 463 | open (val) { | 449 | open (val) { |
| 464 | this.visible = val === true; | 450 | this.visible = val === true; |
| 465 | }, | 451 | }, |
| 466 | type(type){ | 452 | type(type){ |
| 467 | this.onSelectionModeChange(type); | 453 | this.onSelectionModeChange(type); |
| 468 | - } | 454 | + }, |
| 455 | + publicValue(now, before){ | ||
| 456 | + const newValue = JSON.stringify(now); | ||
| 457 | + const oldValue = JSON.stringify(before); | ||
| 458 | + if (newValue !== oldValue) this.$emit('input', now); // to update v-model | ||
| 459 | + }, | ||
| 469 | }, | 460 | }, |
| 470 | mounted () { | 461 | mounted () { |
| 471 | if (this.open !== null) this.visible = this.open; | 462 | if (this.open !== null) this.visible = this.open; |