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; |