antd RangePicker 通过开始时间的选择来禁用结束时间的区间

3 篇文章 0 订阅

前言

以前都是写原生组件习惯了,由于新的项目需要敏捷开发,用到了antd的UI组件。不错,挺牛逼的一个东西。在使用RangePicker时间区间选择组件的过程中,由于业务的需要,需要对时间区间进行禁用,而且是动态的,需要根据选择的开始时间来划定结束时间的禁用范围,我以为是很简单的东西,然而,这个东西真的比我想象中得要复杂那么一丢丢,反正几经周折,算是搞好了。写个文章记录一下…

难点

其实麻烦就麻烦在于动态的去获取选取的开始时间,antd提供的组件中,RangePicker自带提供的onChange事件触发是需要再结束时间之后才执行的,所以这里不能用onChange事件来获取开始事件,需要用到onCalendarChange事件来动态的加载点击的开始时间。啊,对,差不多就是这么个情况,下面贴代码

// 需求是 开始时间在23号之前,则只能当前时间选到当前月23号。开始时间23号之后,则选择当前时间到下月22号,开始时间不可选23号。

const formatter = 'YYYY-MM-DD HH:mm:ss'
//state
state = {
	filter:{
  		beginTime: moment().subtract(1, 'months').startOf('month').add(22, 'days').format(formatter),
  		endTime: moment().format(formatter)
  	},
 	isRangeChange:false
}
const { filter, isRangeChange} = this.state
// 组件
<RangePicker
            value={[moment(filter.beginTime), moment(filter.endTime)]}
            showToday={false}
            allowClear={false}
            onCalendarChange={dates => {
              this.setState({ filter: {beginTime: dates[0], endTime: dates[1] }, isRangeChange: true })
            }}
            onOpenChange={status => this.setState({ isRangeChange: !status })}
            disabledDate={current => {
              let isShow
              if (!isRangeChange) isShow = true
              else {
                const date = moment(filter.beginTime)
                const _startDay = Number(date.format('D'))
                const _startMonth = Number(date.format('M'))
                const _disableDay = Number(current.format('D'))
                const _disableMonth = Number(current.format('M'))
                if (_startDay <= 22) 
                  isShow = (_disableMonth === _startMonth) && (_disableDay <= 22) && (_disableDay > _startDay)
                 else 
                  isShow = (_disableMonth === _startMonth + 1 && _disableDay <= 22) || (_disableMonth === _startMonth && _disableDay > _startDay)
              }
              return !isShow
            }}
            onChange={(val) => {
              const start = val[0].format(formatter)
              const end = val[1].format(formatter)
              this.setState({filter: { beginTime: start, endTime: end}})
            }} />
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值