antd DatePicker 日期 与 时间 分开选择

自定义组件

import { DatePicker } from "antd";
import dayjs from "dayjs";
import { FC, useRef } from "react";

/**
 * 日期 与 时间 分开选择
 *
 * 版本号: 
 * "antd": "^5.17.4",
 * "dayjs": "^1.11.11",
 * "react": "^18.3.1",
 * "react-dom": "^18.3.1",
 * 
 * @param props
 * @returns
 */
let MyDateTimePicker: FC<{
  "aria-required"?: boolean;
  id?: string; // antd Form 文档中说是用来定位的, 滚动到指定 dom, (scrollToField / scrollToFirstError)
  value?: dayjs.Dayjs;
  onChange?: ((date: dayjs.Dayjs | null, dateString: string | string[]) => void) | undefined;
}> = (inProps) => {

  // console.log(inProps);
  let { onChange, id, ...props } = inProps;
  const dateRef = useRef(props.value);

  /**
   * 包一层 onChange,
   * 将 2 个组件的数据合并到一起
   * (因为 antd DatePicker["date"] 会把 时分秒 全部设置为 0 )
   * @param v 当前选择的值 (dayjs对象)
   * @param type 组件的类型
   */
  let handleDateTimeChange = (v: dayjs.Dayjs, type: "date" | "time") => {
  
    // console.log(type, v);
    
    if (v == undefined) {
    
      // 清空表单, 由于两个组件都绑定的 props.value , 所以会一起清空
      dateRef.current = undefined;
      
    } else {
    
      // 如果表单是空的,就获取当前的日期时间, 去操作
      if (dateRef.current == undefined) {
      
        dateRef.current = dayjs();
        
      }
      if (type == "date") {
      
        dateRef.current = dateRef.current
          ?.set("year", v.year()) // 年
          .set("month", v.month()) // 月
          .set("date", v.date()); // 日
          
      } else if (type == "time") {
      
        dateRef.current = dateRef.current
          ?.set("hour", v.hour()) // 时
          .set("minute", v.minute()) // 分
          .set("second", v.second()); // 秒
          
      }
      
    }
    
    // 模仿原生 antd DatePicker 的值
    onChange?.(dateRef.current ?? null, dateRef.current?.toDate().toLocaleString() ?? "");
  };

  return (
    <div className="space-x-2" id={id}>
      <DatePicker
        {...props}
        picker="date"
        onChange={(v) => {
          handleDateTimeChange(v, "date");
        }}
      />
      <DatePicker
        {...props}
        picker="time"
        onChange={(v) => {
          handleDateTimeChange(v, "time");
        }}
      />
    </div>
  );
};

export default MyDateTimePicker;

相关推荐

  1. antd DatePicker 日期 时间 分开选择

    2024-06-09 19:16:04       11 阅读
  2. QT时间日期定时器

    2024-06-09 19:16:04       29 阅读
  3. el-date-picker(日期时间选择)那些事

    2024-06-09 19:16:04       29 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-09 19:16:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-09 19:16:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-09 19:16:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-09 19:16:04       20 阅读

热门阅读

  1. dockerfile,shell脚本,yaml文件如何配合

    2024-06-09 19:16:04       6 阅读
  2. C++数据结构——队列queue

    2024-06-09 19:16:04       9 阅读
  3. 网络安全法对个人保护的要求

    2024-06-09 19:16:04       10 阅读
  4. 【面试宝藏】Redis 常见面试题解析

    2024-06-09 19:16:04       10 阅读
  5. 直接赋值导致响应式断开,前端深浅拷贝

    2024-06-09 19:16:04       8 阅读
  6. Rust-10-数据类型

    2024-06-09 19:16:04       8 阅读
  7. cocos入门7:向量点乘的应用举例

    2024-06-09 19:16:04       8 阅读