RangePicker日期选择递归代码问题及新代码报错求助
问题分析与修复方案
原代码核心问题
- 初始递归逻辑存在缺陷:用
invoke('text')将所有年份文本拼接成字符串,通过includes(year)判断会出现误匹配(比如年份21会匹配2021);同时方向判断代码有语法错误(!n.includes(year).length <0中布尔值无length属性),导致选择更早年份时逻辑混乱。 - 新代码存在语法结构错误:将recurse的校验处理函数错误作为
.then()的第二个参数(错误回调)传递,同时jQuery集合处理方式不够稳妥,最终触发Cannot read properties of undefined (reading 'get')报错。
修复后的代码
const month = monthsShort[date.getMonth()]; const day = date.getDate(); const year = date.getFullYear(); recurse( // 获取当前面板显示的所有年份数字数组 () => cy.get('.mantine-DatePicker-yearsListCell') .then($years => { return $years.map((index, el) => parseInt(el.innerText.trim())).get(); }), // 处理年份数组,判断是否切换面板或终止递归 (currentYears) => { // 目标年份已在当前面板,点击并终止递归 if (currentYears.includes(year)) { cy.get('.mantine-DatePicker-yearsListCell').contains(year.toString()).click(); return true; } // 目标年份早于当前面板最早年份,点击向前按钮 if (year < currentYears[0]) { cy.get('.mantine-DatePicker-calendarHeaderControlIcon').first().click(); return false; } // 目标年份晚于当前面板最晚年份,点击向后按钮 if (year > currentYears[currentYears.length - 1]) { cy.get('.mantine-DatePicker-calendarHeaderControlIcon').last().click(); return false; } }, { limit: 12, } );
关键修复说明
- 修正recurse参数结构:将校验处理函数放在recurse的第二个参数位置,而非
.then()的错误回调位,确保递归逻辑参数传递正常。 - 可靠获取年份数组:用jQuery的
.map()遍历单元格,转为数字数组,避免字符串拼接的误匹配问题,同时保证年份值的准确性。 - 明确递归逻辑:找到目标年份时点击对应单元格并返回
true终止递归;未找到时根据年份相对位置切换面板,返回false继续递归。 - 修复方向判断逻辑:通过目标年份与当前面板首尾年份的比较,准确判断点击向前/向后按钮,解决跨大范围年份选择时的方向错误。
内容的提问来源于stack exchange,提问作者ZombiePie
相关产品推荐
相关产品推荐

