diff --git a/src/datetime-picker/index.js b/src/datetime-picker/index.js index a67449c68..3a468b06d 100644 --- a/src/datetime-picker/index.js +++ b/src/datetime-picker/index.js @@ -1,9 +1,10 @@ import { createNamespace } from '../utils'; import { range } from '../utils/format/number'; +import { isDate } from '../utils/validate/date'; import { padZero } from '../utils/format/string'; import Picker from '../picker'; import { pickerProps } from '../picker/shared'; -import { times, isValidDate, getTrueValue, getMonthEndDay } from './utils'; +import { times, getTrueValue, getMonthEndDay } from './utils'; const [createComponent, bem] = createNamespace('datetime-picker'); const currentYear = new Date().getFullYear(); @@ -40,12 +41,12 @@ export default createComponent({ minDate: { type: Date, default: () => new Date(currentYear - 10, 0, 1), - validator: isValidDate + validator: isDate }, maxDate: { type: Date, default: () => new Date(currentYear + 10, 11, 31), - validator: isValidDate + validator: isDate }, maxHour: { type: Number, @@ -66,6 +67,7 @@ export default createComponent({ watch: { value(val) { val = this.correctValue(val); + const isEqual = this.type === 'time' ? val === this.innerValue @@ -176,7 +178,7 @@ export default createComponent({ // validate value const isDateType = this.type !== 'time'; - if (isDateType && !isValidDate(value)) { + if (isDateType && !isDate(value)) { value = this.minDate; } else if (!value) { value = `${padZero(this.minHour)}:00`; @@ -253,8 +255,8 @@ export default createComponent({ const year = getTrueValue(values[0]); const month = getTrueValue(values[1]); const maxDate = getMonthEndDay(year, month); - let date = getTrueValue(values[2]); + let date = getTrueValue(values[2]); if (this.type === 'year-month') { date = 1; } diff --git a/src/datetime-picker/utils.js b/src/datetime-picker/utils.js deleted file mode 100644 index c54549e24..000000000 --- a/src/datetime-picker/utils.js +++ /dev/null @@ -1,25 +0,0 @@ -export function isValidDate(date) { - return Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date.getTime()); -} - -export function times(n, iteratee) { - let index = -1; - const result = Array(n); - - while (++index < n) { - result[index] = iteratee(index); - } - return result; -} - -export function getTrueValue(formattedValue) { - if (!formattedValue) return; - while (isNaN(parseInt(formattedValue, 10))) { - formattedValue = formattedValue.slice(1); - } - return parseInt(formattedValue, 10); -} - -export function getMonthEndDay(year, month) { - return 32 - new Date(year, month - 1, 32).getDate(); -} diff --git a/src/datetime-picker/utils.ts b/src/datetime-picker/utils.ts new file mode 100644 index 000000000..00006820d --- /dev/null +++ b/src/datetime-picker/utils.ts @@ -0,0 +1,28 @@ +import { isNaN } from '../utils/validate/number'; + +export function times(n: number, iteratee: (index: number) => any[]) { + let index = -1; + const result = Array(n); + + while (++index < n) { + result[index] = iteratee(index); + } + + return result; +} + +export function getTrueValue(value: string | undefined): number | undefined { + if (!value) { + return; + } + + while (isNaN(parseInt(value, 10))) { + value = value.slice(1); + } + + return parseInt(value, 10); +} + +export function getMonthEndDay(year: number, month: number): number { + return 32 - new Date(year, month - 1, 32).getDate(); +} diff --git a/src/utils/validate/date.ts b/src/utils/validate/date.ts new file mode 100644 index 000000000..f7a2e2ed1 --- /dev/null +++ b/src/utils/validate/date.ts @@ -0,0 +1,7 @@ +import { isNaN } from './number'; + +export function isDate(date: Date): boolean { + return ( + Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date.getTime()) + ); +} diff --git a/src/utils/validate/number.ts b/src/utils/validate/number.ts index 47fbc44ad..254e580b2 100644 --- a/src/utils/validate/number.ts +++ b/src/utils/validate/number.ts @@ -1,3 +1,13 @@ +/* eslint-disable no-self-compare */ + export function isNumber(value: string): boolean { return /^\d+(\.\d+)?$/.test(value); } + +export function isNaN(value: any): boolean { + if (Number.isNaN) { + return Number.isNaN(value); + } + + return value !== value; +}