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

React-Date-Picker实现Enter键触发日期变更而非onChange

解决react-date-picker通过Enter键确认日期变更的问题

你当前的思路方向是对的,但直接取event.target.value存在风险——输入框的字符串可能未经过组件的日期校验,手动解析容易出错。推荐通过组件实例获取已验证的日期值,具体调整如下:

步骤1:添加组件引用

用useRef获取DatePicker的实例,直接拿到组件内部维护的选中日期:

import { useRef } from 'react';
import DatePicker from 'react-date-picker';

const SearchDates = ({ onChangeDate, date }: Props) => {
  const datePickerRef = useRef<DatePicker>(null); // 新增ref

  // ... 其他代码
};

步骤2:修改onKeyDown逻辑

从ref中获取组件的value(已处理为Date对象),避免手动解析输入框字符串:

onKeyDown={(event) => {
  if (event.key === 'Enter') {
    event.preventDefault(); // 阻止默认行为(比如表单提交)
    const selectedDate = datePickerRef.current?.value;
    if (selectedDate) {
      onChangeDate(formatDate(selectedDate, fullDate));
    }
  }
}}

步骤3:绑定ref到DatePicker组件

<DatePicker
  ref={datePickerRef} // 绑定ref
  inputRef={(ref) => {
    inputs(ref);
  }}
  // 其他原有属性保持不变
/>

完整修改后的代码

import { useRef } from 'react';
import DatePicker from 'react-date-picker';

const SearchDates = ({ onChangeDate, date }: Props) => {
  const datePickerRef = useRef<DatePicker>(null);

  return (
      <div className={style.search}>
          <DatePicker
              ref={datePickerRef}
              inputRef={(ref) => {
                  inputs(ref);
              }}
              calendarClassName={'calendar'}
              format="dd-MM-yyyy"
              onKeyDown={(event) => {
                  if (event.key === 'Enter') {
                      event.preventDefault();
                      const selectedDate = datePickerRef.current?.value;
                      if (selectedDate) {
                          onChangeDate(formatDate(selectedDate, fullDate));
                      }
                  }
              }}
              shouldCloseCalendar={({ reason }) => reason !== 'select'}
              maxDate={new Date(futureYear(1))}
              minDate={new Date(futureYear(0))}
              locale={'ru-RU'}
              dayPlaceholder={'__'}
              monthPlaceholder={'__'}
              yearPlaceholder={'____'}
              clearIcon={date ? <ClearIndicatorIcon /> : null}
              calendarIcon={<CalendarIcon />}
              showNeighboringMonth={false}
              next2Label={null}
              prev2Label={null}
              prevLabel={<ArrowLeft />}
              nextLabel={<ArrowRight />}
              view={'month'}
              formatMonthYear={(locale: string | undefined, date: Date) => formatDate(date, MonthYear) as string}
              value={date ? (isNaN(Date.parse(date)) ? undefined : new Date(date)) : undefined}
          />
      </div>
  );
};

额外说明

  • 这种方式拿到的selectedDate是组件已校验通过的Date对象,不会出现手动解析输入字符串导致的格式错误;
  • 无论用户是手动输入日期还是通过日历面板选择,按Enter都能正确触发日期确认;
  • event.preventDefault()可以避免页面刷新或表单默认提交等干扰行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:46:36