Antd 日期范围选择框选择一个日期后,面板收起

文章描述了一个产品优化需求,即在初始只有开始时间的情况下,优化RangePicker组件的行为。当用户选择结束日期时,日期选择面板应直接关闭,提升用户体验。实现这一功能涉及对open属性的控制,以及在onCalendarChange、onFocus和onBlur事件中的逻辑处理,包括设置状态、失焦操作和使用setTimeout来确保面板关闭。
摘要由CSDN通过智能技术生成

需求

初始状态只有开始时间,如下图⬇️

在这里插入图片描述
产品需要优化体验:

  1. 点击结束日期
  2. 选择日期
  3. 下拉面板直接收起,而不是需要选择起始时间

思路

  • 需要一段逻辑的open属性控制
  • 后续操作还是由组件内部控制

逻辑

  1. 第一次打开,open控制
  2. 选择了(onCalendarChange)并且是选了后边的,改变状态,并失焦。这里要timeout
  3. open判断条件见代码

代码


// 往返日期有个特殊需求,一开始只有起始时间,当选择了终止时间后,直接关闭弹窗,所以要受控一段逻辑的open
const [wfrqOpenAuto, setWfrqOpenAuto] = useState(value?.wfrq?.[1]); // 这个value的格式是:[Moment,null]
const [wfrqOpen, setWfrqOpen] = useState(false);
const wfrqRef = useRef(null);

<RangePicker
 open={wfrqOpenAuto ? undefined : wfrqOpen}
 onCalendarChange={(data, dataStr, info) => {
   if (info.range === 'end' && isEmpty(wfrqOpenAuto)) {
     setWfrqOpen(false);
     const timer = setTimeout(() => {
       wfrqRef.current?.blur();
       setWfrqOpenAuto(dataStr[1]);
       clearTimeout(timer);
     }, 10);
   }
 }}
 onFocus={() => {
   if (isEmpty(wfrqOpenAuto)) {
     setWfrqOpen(true);
   }
 }}
 onBlur={() => {
   if (isEmpty(wfrqOpenAuto)) {
     setWfrqOpen(false);
   }
 }}
 ref={wfrqRef}
/>
### 回答1: 可以使用 Antd 的 RangePicker 组件,设置其属性 disabledDate 来限制选择范围:disabledDate = {current => { return current && current > moment().endOf('month'); }} ### 回答2: 基于antd日期选择,可以使用DatePicker组件来实现。根据开始日期设置结束日期的限制,可以通过使用disabledDate属性来实现。 具体实现步骤如下: 1. 引入antd的DatePicker组件:import { DatePicker } from 'antd'; 2. 在页面中添加DatePicker组件,并设置属性。 3. 定义日期限制函数disabledDate,该函数会接收当前日期current作为参数。 4. 在disabledDate函数中,根据开始日期设定结束日期的限制。如果当前日期大于开始日期的下一个月的月底,则返回true,表示该日期不可选。 5. 在DatePicker组件的disabledDate属性中绑定disabledDate函数。 下面是示例代码: import React, { useState } from 'react'; import { DatePicker } from 'antd'; const Example = () => { const [startDate, setStartDate] = useState(null); const disabledDate = (current) => { if (!startDate) { // 如果未选择开始日期,返回false,表示所有日期均可选 return false; } // 获取开始日期的下一个月的月底 const endDate = new Date(startDate.getFullYear(), startDate.getMonth() + 1, 0); // 将日期设置为每月的最后一天,并与当前日期进行比较 return current > endDate; } const handleDateChange = (date) => { setStartDate(date); } return ( <DatePicker disabledDate={disabledDate} onChange={handleDateChange} /> ); } export default Example; 以上代码中,通过useState定义了一个startDate状态来存储选择的开始日期,使用disabledDate函数根据开始日期设定了结束日期的限制,handleDateChange函数用于处理日期选择变化的情况。 通过以上操作,就可以实现基于antd日期选择,根据开始日期限制到月底的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值