diff --git a/packages/calendar/index.ts b/packages/calendar/index.ts index 30ad9a45..c3a1ebe0 100644 --- a/packages/calendar/index.ts +++ b/packages/calendar/index.ts @@ -7,7 +7,8 @@ import { calcDateNum, formatMonthTitle, compareMonth, - getMonths + getMonths, + getDayByOffset } from './utils'; import Toast from '../toast/toast'; @@ -266,6 +267,28 @@ VantComponent({ }, select(date, complete) { + if (complete && this.data.type === 'range') { + const valid = this.checkRange(date); + + if (!valid) { + // auto selected to max range if showConfirm + if (this.data.showConfirm) { + this.emit([date[0], getDayByOffset(date[0], this.data.maxRange - 1)]); + } else { + this.emit(date); + } + return; + } + } + + this.emit(date); + + if (complete && !this.data.showConfirm) { + this.onConfirm(); + } + }, + + emit(date) { const getTime = (date: Date | number) => (date instanceof Date ? date.getTime() : date); @@ -273,25 +296,16 @@ VantComponent({ currentDate: Array.isArray(date) ? date.map(getTime) : getTime(date) }); this.$emit('select', copyDates(date)); - - if (complete && this.data.type === 'range') { - const valid = this.checkRange(); - - if (!valid) { - return; - } - } - - if (complete && !this.data.showConfirm) { - this.onConfirm(); - } }, - checkRange() { - const { maxRange, currentDate, rangePrompt } = this.data; + checkRange(date) { + const { maxRange, rangePrompt } = this.data; - if (maxRange && calcDateNum(currentDate) > maxRange) { - Toast(rangePrompt || `选择天数不能超过 ${maxRange} 天`); + if (maxRange && calcDateNum(date) > maxRange) { + Toast({ + context: this, + message: rangePrompt || `选择天数不能超过 ${maxRange} 天` + }); return false; } diff --git a/packages/calendar/index.wxml b/packages/calendar/index.wxml index 1a4f59c7..d4849cc7 100644 --- a/packages/calendar/index.wxml +++ b/packages/calendar/index.wxml @@ -27,3 +27,5 @@ is="calendar" data="{{ title, subtitle, showTitle, showSubtitle, minDate, maxDate, type, color, showMark, formatter, rowHeight, currentDate, safeAreaInsetBottom, showConfirm, confirmDisabledText, confirmText, scrollIntoView, allowSameDay }}" /> + + diff --git a/packages/calendar/utils.ts b/packages/calendar/utils.ts index 57651c6e..aad4b0c3 100644 --- a/packages/calendar/utils.ts +++ b/packages/calendar/utils.ts @@ -49,7 +49,7 @@ export function compareDay(day1: Date | number, day2: Date | number) { return compareMonthResult; } -function getDayByOffset(date: Date, offset: number) { +export function getDayByOffset(date: Date, offset: number) { date = new Date(date); date.setDate(date.getDate() + offset);