You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RangePicker日期选择递归代码问题及新代码报错求助

问题分析与修复方案

原代码核心问题

  1. 初始递归逻辑存在缺陷:用invoke('text')将所有年份文本拼接成字符串,通过includes(year)判断会出现误匹配(比如年份21会匹配2021);同时方向判断代码有语法错误(!n.includes(year).length <0中布尔值无length属性),导致选择更早年份时逻辑混乱。
  2. 新代码存在语法结构错误:将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,
  }
);

关键修复说明

  1. 修正recurse参数结构:将校验处理函数放在recurse的第二个参数位置,而非.then()的错误回调位,确保递归逻辑参数传递正常。
  2. 可靠获取年份数组:用jQuery的.map()遍历单元格,转为数字数组,避免字符串拼接的误匹配问题,同时保证年份值的准确性。
  3. 明确递归逻辑:找到目标年份时点击对应单元格并返回true终止递归;未找到时根据年份相对位置切换面板,返回false继续递归。
  4. 修复方向判断逻辑:通过目标年份与当前面板首尾年份的比较,准确判断点击向前/向后按钮,解决跨大范围年份选择时的方向错误。

内容的提问来源于stack exchange,提问作者ZombiePie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 02:52:48