antd中提供了是日期范围选择器及datepaicker封装日期范围选择器的示例,但是没有时间选择范围的组件,这里使用两个timePicker组合一个事件范围选择器,通过disabled属性限定时间可选择范围;(ts+hook,支持form表单)

基本就是通过disabledHours、 disabledMinutes、disabledSeconds分别判断结束时间大于开始时间,这里设置的最小时间差为0s。

import React, { forwardRef } from 'react';
import { Row, Col, TimePicker } from 'antd';
import moment from 'moment';
import { TimePickerProps } from 'antd/es/time-picker'; interface IProps extends TimePickerProps {
prefixCls?: string;
value?: any;
onChange?: any;
} const TimePickerRange: React.FC<IProps> = (props, ref) => {
const {
prefixCls,
className,
style,
onChange,
value,
disabled,
...rest
} = props; const [startTime, setStartTime] = React.useState(value.start || moment());
const [endTime, setEndTime] = React.useState(value.end || moment()); /*定义时间数组*/
const Hours = Array.from(Array(24), (v, k) => k);
const Minutes = Array.from(Array(60), (v, k) => k);
const Seconds = Array.from(Array(60), (v, k) => k); const triggerChange = changedValue => {
if (onChange) {
onChange(
Object.assign({}, { start: startTime, end: endTime }, changedValue)
);
}
}; /*结束时间控制-hour*/
const disEndHouse = () => {
if (startTime) {
let h = startTime.hour();
return Hours.slice(0, h);
}
return [];
}; /*结束时间控制-minute)*/
const disEndMinute = h => {
if (startTime) {
if (h > startTime.hour()) return [];
let m = startTime.minute();
return Minutes.slice(0, m);
}
return [];
}; /*结束时间控制-second*/
const disEndSeconds = (h, m) => {
if (startTime) {
if (h > startTime.hour()) return [];
if (m > startTime.minute()) return [];
let s = startTime.second();
return Seconds.slice(0, s);
}
return [];
}; /*开始时间控制-hour*/
const disStartHouse = () => {
if (endTime) {
let h = endTime.hour();
return Hours.slice(h, Hours.length - 1);
}
return [];
}; /*开始时间控制-minute*/
const disStartMinute = h => {
if (endTime) {
if (h < endTime.hour()) return [];
let m = endTime.minute();
return Minutes.slice(m, Minutes.length - 1);
}
return [];
}; /*开始时间控制-second*/
const disStartSeconds = (h, m) => {
if (endTime) {
if (h < endTime.hour()) return [];
if (m < endTime.minute()) return [];
let s = endTime.second();
return Seconds.slice(s, Seconds.length - 1);
}
return [];
}; return (
<Row ref={ref}>
<Col span={12}>
<TimePicker
allowClear={false}
disabled={disabled}
onChange={value => {
setStartTime(value);
triggerChange({ start: value });
}}
value={value.start || moment('00:00:00', 'HH:mm:ss')}
disabledHours={disStartHouse}
disabledMinutes={disStartMinute}
disabledSeconds={disStartSeconds}
/>
</Col>
<Col span={12}>
<TimePicker
allowClear={false}
disabled={disabled}
onChange={value => {
setEndTime(value);
triggerChange({ end: value });
}}
value={value.end || moment('23:59:59', 'HH:mm:ss')}
disabledHours={disEndHouse}
disabledMinutes={disEndMinute}
disabledSeconds={disEndSeconds}
/>
</Col>
</Row>
);
}; export default forwardRef(TimePickerRange);

出处链接:https://juejin.im/post/5d23e4fc6fb9a07edf2769ce

Antd使用timePicker封装时间范围选择器(React hook版)的更多相关文章

  1. AntD使用timePiacker封装时间范围选择器(React hook版)

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  2. 使用React Hook后的一些体会

    一.前言 距离React Hook发布已经有一段时间了,笔者在之前也一直在等待机会来尝试一下Hook,这个尝试不是像文档中介绍的可以先在已有项目中的小组件和新组件上尝试,而是尝试用Hook的方式构建整 ...

  3. React Hook:使用 useEffect

    React Hook:使用 useEffect 一.描述 二.需要清理的副作用 1.在 class 组件中 2.使用 effect Hook 的示例 1.useEffect 做了什么? 2.为什么在组 ...

  4. React Hook 入门使用

    React Hook 是什么 1.没有比官网说的更好的 HOOK 1. React Hook 官方 2. 用我们自己的话说,它是一个钩子函数,用来处理组件间的状态的一个方法,暂时理解为一个高阶函数吧. ...

  5. [React] Detect user activity with a custom useIdle React Hook

    If the user hasn't used your application for a few minutes, you may want to log them out of the appl ...

  6. React Hook 学习

    1.官方文档 https://react.docschina.org/docs/hooks-intro.html 2.阮一峰 reactHook http://www.ruanyifeng.com/b ...

  7. GraphQL + React Apollo + React Hook + Express + Mongodb 大型前后端分离项目实战之后端(19 个视频)

    GraphQL + React Apollo + React Hook + Express + Mongodb 大型前后端分离项目实战之后端(19 个视频) GraphQL + React Apoll ...

  8. GraphQL + React Apollo + React Hook 大型项目实战(32 个视频)

    GraphQL + React Apollo + React Hook 大型项目实战(32 个视频) GraphQL + React Apollo + React Hook 大型项目实战 #1 介绍「 ...

  9. React Hook上车

    React Hook 是 v16.8 的新功能,自诞生以来,受到广泛的好评,在 React 版本更新中具有里程碑的意义.现在都2020年了,再不上车 React Hook 就真的 out 了... H ...

随机推荐

  1. epx中设置断掉调试

    以前总听师傅们说,做pwn题,多调试,多调试. 师傅都说用gdb,但是我刚接触linux程序调试的时候用的是pwndbg,后来就用顺手了.但是调试一些简单程序还好,直接用pwndbg打开.但是这年头简 ...

  2. 显示摘要任务(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 用熬肥的同学都知道,在熬肥的[文件]>[选项]设置中,[高级]才是最多选项设置的地方: 张同学亦如是说. 比如一个比 ...

  3. java 数据类型:枚举类enum、对比方法compreTo()、获取名字.name()、获取对应值的枚举类Enum.valueOf()、包含构造方法和抽象方法的enum;实现接口;

    问题引入 为了将某一数据类型的值限定在可选的合理范围内,比如季节只有四个:春夏秋冬. 什么是枚举类 Java5之后新增了enum关键字(他与class,interface关键字地位相同)用来定义枚举类 ...

  4. JuiceFS 数据加密原理

    JuiceFS 作为分布文件系统,每天与海量的数据打着交道,因此数据的安全性尤为关键,今天就来介绍一下 JuiceFS 在数据加密方面所做的努力. 传输中数据加密 JuiceFS 在网络上传输时会对数 ...

  5. 【LeetCode】721. Accounts Merge 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/accounts ...

  6. 1170 - Counting Perfect BST

    1170 - Counting Perfect BST   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 3 ...

  7. MCU变量加载过程

    前言 在开发mcu代码的时候经常会有些疑惑,变量是怎么在编译之后进入单片机的ram区的呢,特别是在使用keil开发的时候.后来在接触gcc编译器和自研的mcu后,终于明白了这个问题.实际上变量编译后被 ...

  8. 第三十一个知识点:Game Hopping证明

    第三十一个知识点:Game Hopping证明 关于安全证明, 目前主流的方法有安全归约证明 (由 single game 实现) 和 Game Hopping (由 game sequence 实现 ...

  9. linux系统安装java

    1.下载Java压缩包 *.gz 2.解压 3.修改Linux配置文件,配置Java环境变量 4.使用命令source /etc/profile让修改生效 转载 https://www.cnblogs ...

  10. CS5265替代LT8711设计TYPEC转HDMI 4K高清投屏方案|LT8711龙迅替代方案

    龙迅LT8711是一款Type-C/DP1.2 to HDMI2.0方案芯片.LT8711HE是一款高性能Type-C/DP1.2至HDMI2.0转换器,设计用于将USB typec或DP1.2源连接 ...