From 92153555c3dbf6839aceb86de9f62055a5b62c76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=B7=87?= Date: Fri, 13 Feb 2026 11:13:09 +0800 Subject: [PATCH] fix(calendar): check year-month range with minDate & maxDate - Extend checkRange function to accept month and validate against minDate & maxDate - Fix changeMonthHandler/changeYearHandler to pass month and prevent invalid month navigation --- .../components/u-calendar/u-calendar.vue | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/uni_modules/uview-pro/components/u-calendar/u-calendar.vue b/src/uni_modules/uview-pro/components/u-calendar/u-calendar.vue index ab66934..e4ed9da 100644 --- a/src/uni_modules/uview-pro/components/u-calendar/u-calendar.vue +++ b/src/uni_modules/uview-pro/components/u-calendar/u-calendar.vue @@ -450,13 +450,20 @@ function getWeekday(yearNum: number, monthNum: number) { } /** - * 检查年份是否超出范围 + * 检查年月是否超出范围 */ -function checkRange(yearNum: number) { +function checkRange(yearNum: number, monthNum: number) { let overstep = false; if (yearNum < Number(props.minYear) || yearNum > Number(props.maxYear)) { uni.showToast({ title: t('uCalendar.outOfRange'), icon: 'none' }); overstep = true; + } else if (props.minDate && props.maxDate) { + const beforeMin = yearNum < min.value.year || (yearNum === min.value.year && monthNum < min.value.month); + const afterMax = yearNum > max.value.year || (yearNum === max.value.year && monthNum > max.value.month); + if (beforeMin || afterMax) { + uni.showToast({ title: t('uCalendar.outOfRange'), icon: 'none' }); + overstep = true; + } } return overstep; } @@ -468,16 +475,18 @@ function changeMonthHandler(isAdd: number) { if (isAdd) { let m = month.value + 1; let y = m > 12 ? year.value + 1 : year.value; - if (!checkRange(y)) { - month.value = m > 12 ? 1 : m; + m = m > 12 ? 1 : m; + if (!checkRange(y, m)) { + month.value = m; year.value = y; changeData(); } } else { let m = month.value - 1; let y = m < 1 ? year.value - 1 : year.value; - if (!checkRange(y)) { - month.value = m < 1 ? 12 : m; + m = m < 1 ? 12 : m; + if (!checkRange(y, m)) { + month.value = m; year.value = y; changeData(); } @@ -489,7 +498,7 @@ function changeMonthHandler(isAdd: number) { */ function changeYearHandler(isAdd: number) { let y = isAdd ? year.value + 1 : year.value - 1; - if (!checkRange(y)) { + if (!checkRange(y, month.value)) { year.value = y; changeData(); }